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