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