Ir ao conteúdo

Posts recomendados

Postado

Bom dia, estou fazendo (tentando) um jogo da forca e já tive um probleminha na hora de inserir o nome dos jogadores. Quero que não seja possível algum dos nomes ficar vazio. Usei a função "strlen" para fazer a contagem de caracteres e usei um if pra retornar à um certo ponto do programa caso a contagem de caracteres seja 0, porém não tive muito sucesso. Também quero evitar que o usuário aperte apenas o ESPAÇO, pois se eu não me engano ESPAÇOS também contam como caracteres. Então seria algo do tipo : caso a string seja fazia ou contenha APENAS espaços, retorne à x linha do código. Caso usem um código mais avançado pra isso, com vários ponteiros e etc, peço que por favor coloquem comentários explicando as partes do código, pois ainda sou iniciante (ou quase) em programação. Desde já agradeço.

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<ctype.h>
#include<string.h>


main()
{
	setlocale(LC_ALL,"portuguese");
	
	char palavra[100], tentativa;
	int st=0, contador=0, tamanho_str=0;
    
    	struct jogadores
	{
		char ident[50];
	} player_name[6];
	
	
	printf("\n\t\t\t\t\t\t\tJogo da Forca");
	
	
	L15:
	
	printf("\n\nEscolha o número de jogadores (máximo 6) : ");
	scanf("%d",&st);
	
	fflush(stdin);
	
		if(st!=1 && st!=2 && st!=3 && st!=4 && st!=5 && st!=6) // Verifica se o número digitado é algum dos permitidos na quantidade de jogadores (1-6)
	{
		system("cls");
		printf("\n\t\t\t\t\t\t\tJogo da Forca");
		goto L15;
	}	
	
	
	L38:
	
	for(contador=0; contador<st; contador++)
	{
		printf("Insira o nome do jogador %d : ",contador+1);
		fgets(player_name[contador].ident, 50, stdin);
		
		tamanho_str = strlen(player_name[contador].ident);
		
		if(tamanho_str == 0)
		{
			goto L38;
		}
	}
	
	
	
	
	return 0;
}

 

 

Postado
10 minutos atrás, Celestino Alona disse:

caso a string seja fazia ou contenha APENAS espaços,

/* str_isnull: se a string for vazia retorna 1 */
int str_isnull( const char str[] )
{
  unsigned space= 0;
  unsigned c= 0;

  while ('\0' != str[c]) {

    if (' ' == str[c]) space+= 1;
    c+= 1;
  }
  return c == space;
}

 

  • Curtir 1
  • Membro VIP
Postado

@AnsiC, sobre:

3 horas atrás, AnsiC disse:
/* str_isnull: se a string for vazia retorna 1 */
int str_isnull( const char str[] )
{
  unsigned space= 0;
  unsigned c= 0;

  while ('\0' != str[c]) {

    if (' ' == str[c]) space+= 1;
    c+= 1;
  }
  return c == space;
}

 

Acho que não vai servi. Pelo que eu entendi, o código está "contanto quantos espaços existem no char[], mas não é isso que foi pedido. Ele quer:

 

3 horas atrás, AnsiC disse:

caso a string seja fazia ou contenha APENAS espaços,

 

Ou seja, "sem nada" ou "APENAS espaços", mas seu código estaria dizendo "quantos espaços". É diferente.   Se estiver enganado, favor me corrija.

 

 

 

 

@Celestino Alona, sobre:

3 horas atrás, Celestino Alona disse:

@AnsiC  A primeira linha pelo que eu entendi é uma função separada né ?

 

Não, a primeira linha é apenas um comentário... explicando o que acontecerá se a char[] estiver vazia.

 

 

Sobre:

3 horas atrás, Celestino Alona disse:

Eu entendi a ideia, porém o código em si não kkkk. De qualquer forma obrigado pela atenção, já me deu uma luz pelo menos

 

Como citado acima, o código retorna quantos espaços tem na char[], ou seja, se não tiver espaços, vai retornar 1, se tiver mais de um, vai retornar a quantidade de espaços + 1, ex.: "Maria dos Santos", iria retornar 3. Pois tem 2 espaços dentro.

 

 

Para usar a função,  você copiaria todo o código para o seu... ai, utilizaria a função quando precisasse. Tipo... após ler o nome, invoca essa função passado o nome lido, e pegaria a resposta... se for 1, o nome não tem espaços. Se for maior que 1, tem espaços nele.

 

 

obs.: assim eu entendi, eu não testei o código, posso está enganado. Outra coisa... se digitar só espaços vai funcionar (iria retornar mais de um espaço), mas se digitar um nome composto, iria dar um falso negativo.

adicionado 8 minutos depois

 

 

UPDATE

Vi o meu erro!!! rs

 

O segredo está no "c==space", ou seja, se a quantidade de letras for igual a quantidade de espaços, então retorna 1, caso contrário, retorna 0.   Acho que é isso. isnull = "é nula", ou seja, está verificando se é nula ou não.

obs.: preferi deixar o comentário, em vez de editar o erro na minha interpretação inicial.

 


Resumindo:
Vai funcionar.

Você precisaria implementar algo como:

"repita a leitura do nome até que str_isnull(player_name[contador].ident) diferente de 1". (pois 1 significa que é inválida para o seu contexto)

  • Obrigado 1
Postado

Talvez eu não tenha entendi o que @Celestino Alona queria.

 

  • Não o código não diz os espaços. Retorna 1 para {sem nada ou PENAS espaços}
10 minutos atrás, Simon Viegas disse:

Ou seja, "sem nada" ou "APENAS espaços", mas seu código estaria dizendo "quantos espaços". É diferente.   Se estiver enganado, favor me corrija.

   

adicionado 1 minuto depois

No contexto toda string sem NADA ou de apenas ESPAÇOS é Vazia.

  • Curtir 1
  • Membro VIP
Postado
33 minutos atrás, AnsiC disse:

No contexto toda string sem NADA ou de apenas ESPAÇOS é Vazia.

 

Acho que tinha entendido... se for um dos dois acima, retorna 1, caso contrário, retorna 0. Correto?

 

obs.: eu não tinha percebido o "c==space". Depois eu inseri um update. :thumbsup:

  • Curtir 1
Postado

Também poderia substituir:

fgets(player_name[contador].ident, 50, stdin);

por:

scanf(" %50[^\n]", player_name[contador].ident);

Para não capturar espaços no início da string e capturar string vazia "" se o usuário só digitar espaços.

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!