aula 311

Como garantir que o usuário vai digitar um número?

Vamos a mais uma aula de dúvidas? E na aula de hoje vamos aprender como validar a entrada de dados feita pelo usuário garantindo que seja digitado ao menos um número.

No mundo real é necessário fazer todas as validações possíveis a fim de minimizar as chances do programa apresentar algum erro já em produção, quando está sendo utilizado. Dentre essas validações está garantir que o dado informado pelo usuário é o tipo de dado esperado pelo sistema. Então, como garantir que o valor digitado pelo usuário é de fato um número e não caracteres?

Isso é bastante simples de resolver e pode ser feito com a função scanf que já conhecemos. Desde o início do curso eu tenho dito que scanf é uma função. Bom, se é uma função significa que ela retorna algum valor e esse valor deve ter alguma utilidade, certo?

O valor retornado pela função scanf é exatamente a quantidade de dados que a função conseguiu ler. Vamos a um exemplo para facilitar as coisas. Observe a linha a seguir:
scanf(“%d%d”, &a, &b);
Após a linha anterior ser executada a função scanf deve retornar o valor 2 se foram digitados dois números, pois dissemos à função que ela deve ler dois números inteiros, por isso o %d. Contudo, caso sejam digitados dois caracteres, o retorno será zero, pois nenhum número será encontrado no buffer do teclado.

Assim, basta verificar o retorno da função scanf dentro de uma repetição. Fazer a leitura enquanto valores numéricos não forem lidos, como apresentado a seguir:

    do{
        printf("Digite um valor: ");
        retorno = scanf("%d", &valor);
        printf("Retorno: %d\n", retorno);
    }while(retorno == 0);

Contudo, o código acima possui um problema. Se a variável retorno possui o valor zero, significa que não foram digitados números inteiros. Porém, alguma coisa foi digitada e isso fará nosso programa entrar em loop infinito.

Quando chega na função scanf o computador verifica se já tem algo no buffer do teclado, tenta ler e não consegue, o retorno é zero, e então volta para a primeira linha após o do, chega na função scanf novamente, constata que tem dados no buffer, tenta ler, o retorno é zero, e volta ao início, novamente, infinitamente.

Precisamos limpar o buffer do teclado para evitar esse loop infinito e isso pode ser feito facilmente com a função getchar().

O último dado no buffer do teclado sempre será um “\n”, que representa a tecla ENTER. Assim, basta ler caracter por caracter enquanto o caracter lido for diferente de “\n”, como apresentado no trecho de código a seguir, limpando o buffer e dando oportunidade para o usuário digitar novamente.

    do{
        printf("Digite um valor: ");
        retorno = scanf("%d", &valor);
        printf("Retorno: %d\n", retorno);

        do{
            letra = getchar();
            printf("%c", letra);
        }while(letra != '\n');
    }while(retorno == 0);

Código de exemplo completo em C para verificar que tipo de informação o usuário digitou

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

int main(){

    int valor, retorno = -1;
    char letra;

    do{
        printf("Digite um valor: ");
        retorno = scanf("%d", &valor);
        printf("Retorno: %d\n", retorno);

        do{
            letra = getchar();
            printf("%c", letra);
        }while(letra != '\n');
    }while(retorno == 0);

    printf("Valor digitado: %d\n", valor);

    return 0;
}

Este post tem um comentário

  1. Alexandre Giordan.

    Estou no primeiro semestre de ADS, e tinha uma atividade para fazer em C. Sua video aula me ajudou muito para fazer o código.

    #include
    #include
    #include

    int main () {
    setlocale (LC_ALL, “Portuguese”);
    int num, retnum, sair, retsair, fim;
    char validanum, validasair;
    printf(“**Algoritimo que verifica se um número é positivo ou negativo.**\n\n”);
    do{

    do{
    printf(“Digite um número diferente de 0: “);
    retnum = scanf(“%d”, &num);
    do{
    validanum = getchar();
    }
    while(validanum != ‘\n’);

    }
    while(retnum == 0);
    if(num == 0){
    printf(“Por favor digite um número diferente de 0.\n\n”);
    }
    else if(num > 0){
    printf(“O número informado é positivo.\n\n”);
    }
    else{
    printf(“O número informado é negativo.\n\n”);
    }
    do{
    printf(“1 para Continuar, ou 2 para Sair.”);
    retsair = scanf(“%d”, &sair);
    do{
    validasair = getchar();
    }
    while(validasair != ‘\n’);
    if ((sair ==1)||(sair == 2)){

    if (sair == 1){
    fim = 0;
    }
    else{
    fim =1;
    }
    }

    }
    while(retsair ==0);
    }
    while(fim == 0);
    return 0;

    }

Deixe um comentário

8 − 2 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.