Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Limitador de entradas para o usuário.

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.

3 respostas
solução!

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 :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software