Conclui o jogo de adivinhação do curso em C, porem tem um pequeno erro que não consigo resolver, que é fazer com que o usuário digite apenas números na hora do chute, pois o programa entra em loop infinito caso seja digitado caracteres caracteres.
Conclui o jogo de adivinhação do curso em C, porem tem um pequeno erro que não consigo resolver, que é fazer com que o usuário digite apenas números na hora do chute, pois o programa entra em loop infinito caso seja digitado caracteres caracteres.
Olá, Renan!
A função scanf
deve receber como primeiro parâmetro uma string
representando a entrada e mais n
argumentos contendo o endereço de memória onde devem ser armazenados os valores lidos. Por exemplo:
scanf("%d", &chute);
(Onde o formato especificado é apenas um número inteiro e N
é 1, pois estamos usando apenas um endereço de memória)
A função scanf
retorna um número inteiro representando o número de argumentos que foram preenchidos com sucesso. Caso alguma conversão falhe, a função retorna e a entrada do usuário continua no buffer.
Se a entrada do usuário continua no buffer, a próxima chamada de scanf
encontrará o mesmo texto e falhará novamente - como está acontecendo em nossa aplicação de Adivinhação.
Sabendo disto, podemos verificar o número de parâmetros convertidos com sucesso e, caso tenha havido algum erro de conversão, devemos limpar o buffer!
Fazendo estas alterações no código, teremos:
int scanfResult = scanf("%d", &chute);
// tratando entrada inválida, quando a função scanf
// não pôde combinar a entrada com o formato
// especificado.
if (scanfResult != 1) {
char c;
do {
// Usamos a função getchar para limpar o buffer de entrada.
// Enquanto não encontrarmos uma quebra de linha '\n' ou
// a marcação de Fim De Arquivo (EndOfFile, EOF) continuaremos
// capturando caracteres do buffer até este ficar vazio.
c = getchar();
} while(c != '\n' && c != EOF);
printf("Entrada invalida. Digite um numero!\n");
i--;
continue;
}
Agora que limpamos o buffer em uma falha de conversão, a função printf
aguarda uma nova entrada do usuário!
Obrigado Guilherme, funcionou perfeitamente! Único detalhe que depois do "printf" você colocou "i--", e seria o "c--" a variável certa, mas acredito que isso tenha acontecido por força do habito haha, mais uma vez obrigado!
Renan,
Em meu código, usei a variável i
, porque, no código que baixei, a variável de iteração usada foi esta:
// loop principal do jogo
for(int i = 1; i <= totaldetentativas; i++) {
...
}
De qualquer modo, quis repetir o comportamento do jogo quando o usuário digita um número negativo!
Só quis reforçar isto, porque, você sugeriu que o correto seria c--
, mas em meu código c
é uma variável do tipo char
e estou usando-a apenas para guardar os caracteres lidos do buffer e comparação com EOF ou quebra-de-linha.
De qualquer modo, fico feliz em saber que sua dúvida tenha sido solucionada :)