Checagem de erro do scanf

Publicado por Hunz em 17/09/2004

[ Hits: 16.627 ]

Blog: http://tnegri.com/

 


Checagem de erro do scanf



Acho que isso incomoda alguns novos programadores em C, seria a checagem de erro em scanf.

Exemplo, você quer fazer um menu bem simples com 3 opções, essas opções são inteiros (1, 2, 3)..

Quando você roda o programa, o menu funciona, mas se você digitar algo diferente de um inteiro, provavelmente o programa irá entrar em um loop infinito de fazer "nada", digamos, o programa ira "travar".

Como acabar com isso? Simples.
O scanf retorna o valor 0 (zero) para algum valor/caracter que ele não conseguir assimilar com o proposto, por exemplo se você entrar com "a" em um scanf que pede por '%d'.

Exemplo? OK. Voltando ao menu. Você usou esse comando para pegar a opção do usuário:

scanf("%d",&menu);
printf("Você escolheu a opção %d.",menu);

Se, o scanf retorna 0 (zero) quando há algum problema, então poderíamos substituir o código por:

if (scanf("%d",&menu) == 0) {
printf("Entre com um inteiro!");
} else {
printf("Você escolheu a opção %d.",menu);
}

Vale lembrar que "scanf("%d",menu) == 0" é completamente diferente de "menu == 0".

Quando você usa o:

if (menu == 0) {
...
}

Você está testando se o valor de "menu" é 0 (zero).

Usando:

if (scanf("%d",&menu) == 0) {
...
}

Você está testando se o "scanf" assimilou.

Espero que isso seja de alguma ajuda.

Abraços.
Fique com Deus.

Outras dicas deste autor

STDPRN para GCC

aMSN travando? Sem problemas!

O poder do #define

Movendo o cursor em C usando Console Escape Sequence

Leitura recomendada

Getchar(); sendo ignorado? Não mais!

Imprimir na mesma linha em C

Exibindo código ASCII das teclas

Curso de C em vídeo ambientado no Linux

Incluindo paths para os seu próprios headers

  

Comentários
[1] Comentário enviado por HunZ em 19/09/2004 - 10:48h

Fiz uma biblioteca que checa o SCANF.

Se alguém quiser:
http://www.vivaolinux.com.br/scripts/verScript.php?codigo=613

Abraços,
fiquem com Deus.

[2] Comentário enviado por rodrigocachaca em 09/03/2005 - 11:21h

O problema eh q os novos programadores fazem um "if" e acham q sao programadores d verdade!!!! pensando q podem fazer tudo com um "if"
na verdade o scanf naum dah erro e sim o programador causa o erro ao naum fazer a coisa certa dah uma olhada nesse exemplo q eu to mandando q tu vai intende o q eu to dizendo:

//by Rodrigo Cachaça
#include <stdio.h>
#include <conio.h>
main()
{
int op;
float deb,cred,tdeb,tcred;
deb=0;
cred=0;
tdeb=0;
tcred=0;
do{

puts("1 - Debito");
puts("2 - Credito");
puts("3 - Fim");
puts("Escolha uma opcao");
scanf("%d",&op);
switch(op)
{ case 1:
printf("Digite o valor\n");
scanf("%f",&deb);
tdeb+=deb;

break;
case 2:
printf("Digite o valor\n");
scanf("%f",&cred);
tcred+=cred;
break;
case 3:
printf("Total de Debitos = R$ %4.2f\n",tdeb);
printf("Total de Creditos = R$ %4.2f\n",tcred);
printf("Saldo Total = R$ %4.2f\n",tcred-tdeb);
break;
default:
printf("Opcao invalida");
}getch();
}while(op!=3);
}

[3] Comentário enviado por hunz em 09/03/2005 - 12:27h

rodrigocachaca,
se na hora de entrar com o valor do inteiro 'op' o usuario entrar com 'a', 'b', 'abc' ou qualquer coisa que seja diferente de um inteiro, o programa vai entrar em um loop infinito e nao ira fazer mais nada, nao ira responder.
A checagem de erro do scanf é essencial, em minha opiniao, para um programa desse genero.

Abraços,
fiquem com Deus

[4] Comentário enviado por rodrigocachaca em 09/03/2005 - 13:06h

seguinte velho;
nesse mesmo exemplo q eu mandei coloca essa alteracao:
do{
op=""; // limpa a variavel op(opcao)
puts("1 - Debito");
puts("2 - Credito");
puts("3 - Fim");
.
.
.
default:
printf("Opcao invalida");
scanf("%*c"); //corrige o erro das letras c/ numeros



quando tu mistura letras e numeros, ou seja
char com int
dah erro no scanf!!!
entaum usa-se scanf("%*c");
para corrigir
faca as alteracoes q coloquei acima q vai funcionar
ja testei aki funcionou
ok
qualquer coisa me manda um email
prgrodrigo@terra.com.br

[5] Comentário enviado por rodrigocachaca em 09/03/2005 - 13:36h

me avisa c o problema
foi resolvido
ok
[]'s

[6] Comentário enviado por rafael.adp em 29/09/2005 - 10:51h

usando um switch isso seria desnecessario, nao?? assim como o primeiro exemplo mostrado???? defafault imprime opcao invalida.. vc faz um do{ }while a opcao for diferente da opcao pra sair.. e boa.. enqto na digitar um int nao vai parar de pedir o numero :)

[7] Comentário enviado por removido em 23/10/2005 - 04:11h

Vou entrar nessa e tentar ajudá-los, se me permitem a intrusão.
Até a volta

sds, iridium

[8] Comentário enviado por jochan em 14/12/2005 - 14:41h

Muito legal, vai me ajudar bastente no meu projeto de C++ ... =)

[9] Comentário enviado por may em 30/03/2006 - 16:13h

Olá Rodrigo!
Queria q vc me explicasse o significa essa utilização do scanf("%*c"); e o op="".

Obrigada!

[10] Comentário enviado por cyberquantum em 02/06/2006 - 02:29h

Uma dica legal e' usar:
scanf("%*[^123] %d",&var);

Só ira aceitar 1, 2 ou 3 por ex...

Obrigado.

[11] Comentário enviado por SithTux em 25/05/2007 - 11:56h

Daria para usar o scanf ler um caracter, que envolve numeros e letras, então não teria problema se o usuario digitace uma letra... apenas iria cair no defaulth. Usando o scanf para ler caracter é preciso uma função que limpa o buffer do teclado: fflush(stdin);
Ex:

puts("1 - Debito");
puts("2 - Credito");
puts("3 - Fim");
puts("Escolha uma opcao");
fflush(stdin);
scanf("%c",&op);
....
valew...

[12] Comentário enviado por Steve em 12/05/2018 - 23:29h

Comentário enviado por cyberquantum em 02/06/2006 - 02:29h
Uma dica legal e' usar: scanf("%*[^123] %d",&var);
Só ira aceitar 1, 2 ou 3 por ex...


Achei essa sua dica PERFEITA, simples e funcional!



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts