Ir ao conteúdo
  • Cadastre-se
Celestino Alona

C Contagem de caracteres na String

Recommended Posts

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;
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC  A primeira linha pelo que eu entendi é uma função separada né ? 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Sim
10 minutos atrás, Simon Viegas disse:

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

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Editado por isrnick
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×