Ir ao conteúdo
  • Cadastre-se
Celestino Alona

C Impedir o usuário de inserir letras

Recommended Posts

Boa noite (ou bom dia, pois são 1:02). Estou tentando fazer um código de jogo da forca, porém quando fui começar pensei em dar um jeito de o usuário não poder inserir letras na hora de selecionar o número de jogadores, que vai de 1-6. Pesquisei algumas opções e encontrei uma função da biblioteca ''ctype.h" chamada "isdigit", porém acho que não estou a usando corretamente, pois o código não está funcionando da maneira que eu gostaria.

 

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


main()
{
	setlocale(LC_ALL,"portuguese");
	
	char name[100], tentativa;
	int st=0, contador=0;
    
    	struct jogadores
	{
		char ident[50];
	} nomes[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(isdigit(st)!=0) /* Se for um número */
	{
		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;
	}	
	}

	else // Se não for um número
	{
		system("cls");
		printf("\n\t\t\t\t\t\t\tJogo da Forca");
		goto L15;
	}
	
	
	
	
	
	return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

isdigit() serve para verificar se um caractere (char) é um dígito, e não se aplica para o que você deseja fazer.

 

O scanf já está usando o especificador %d que serve para ler apenas números inteiros decimais, logo nenhuma letra será capturada como entrada.

 

O que você quer é checar se o número obtido é um número entre 1 e 6, então basta fazer um if assim:

if (st >= 1 && st <= 6){

}

Que checa se st é maior ou igual a 1 E menor ou igual a 6 ( 1 ≤ st ≤ 6 ).

Compartilhar este post


Link para o post
Compartilhar em outros sites

nesses casos o melhor é aprender a usar o valor de retorno do scanf:
 


/*
3 The scanf function returns the value of the macro EOF if an input failure occurs before the first 
conversion (if any) has completed. Otherwise, the scanf function returns the number of input items 
assigned, which can be fewer than provided for, or even zero, in the event of an early matching failure.

3 A função scanf retorna o valor da macro EOF se ocorrer um falho de entrada antes que a primeira
conversão(se houver) seja concluída. Caso contrário, a função scanf retorna o número de itens de entrada
atribuído, que pode ser menor do que o previsto, ou mesmo nula, em caso de uma falha de correspondência de início.

3 La función scanf devuelve el valor de la EOF macro si un fallo de entrada tiene lugar antes de la primera
conversión (si los hay) sea completada. De lo contrario, la función scanf devuelve el número de elementos de entrada
asignado, que puede ser menor de lo previsto, o incluso cero, en caso de un fallo de concordancia temprano.
*/


/*
La función scanf retorna el número de datos de entrada asignados, que puede ser menor que ofrecido, 
incluso cero, en el caso de un error de asignación. Si un error de entrada ocurre antes de cualquier 
conversión, la función fscanf retorna el valor de la macro EOF.

A função scanf devolve o número de dados de entrada designado, que podem ser inferiores a oferecida, mesmo nulo, no caso de um erro de alocação. Se ocorre um erro de entrada antes de qualquer conversão, a função fscanf retorna o valor do EOF macro.
*/
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    
    int res = scanf ( "%d", &n );
    
    if ( res == 0 )
        printf ( "Encontrado falho\n" );
        
    if ( ferror ( stdin ) )
        perror ( "error" );
        
    if ( feof ( stdin ) )
        printf ( "end-of-file encontrado.\n" ); // Ctrl+Z en Windows
        
    printf ( "\n%d", n );
    
    return 0;
}

Fiz uma tradução meia boca com meu "inglês afiado", espero que dê para entender, si alguém quiser melhorar a tradução beleza.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Celestino Alona Olá. Se é p um jogo crie uma função p isso. É apenas uma sugestão, já q o tópico já foi resolvido

#include <stdio.h>

int isNum(int num) {
    return (0 <= num && num <= 9);
}

int main() {

    int num;
    char ch;

    do {
        printf("digite um numero: ");
        scanf("%d", &num);
        scanf("%c", &ch); // limpar o buffer

        if (!isNum(num))
            printf("Erro: caractere invalido\n");

    } while (!isNum(num));

    printf("\nNumero: %d\n", num);

    return 0;
}

 

adicionado 15 minutos depois

Eu coloquei de 0 a 9. Você pode colocar d 1 a 6, de acordo com a necessidade

  • Curtir 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

×