Problema função scanf

1. Problema função scanf

Reis
gnu_reis

(usa Slackware)

Enviado em 03/10/2007 - 15:50h

Boa tarde Camaradas!

Estou desenvolvendo um programa e me deparei com o seguinte problema:

Num certo trecho é solicitado que seja feita uma escolha entre a opção 1 ou 2, isso dentro de um laço while, o trecho do programa é:

printf("Fibonacci digite 1 ou primos digite 2: ");

do{
scanf("%c",&opcao);

if(opcao == '1')
fibonacci();
else if(opcao == '2')
primo();
else
printf("Digite novamente: ");

}while(opcao != '1' && opcao != '2');

caso seja digitado um valor inválido, por exemplo 4, a saída fica assim:

Fibonacci digite 1 ou primos digite 2: 4
Digite novamente: Digite novamente:

como se fosse digitado duas vezes, substitui o scanf por getchar, mas continua o mesmo problema.

Se alguem puder me ajudar fico agradecido!


  


2. hum...

Victor Guimarães Nunes
nunesvictor

(usa Ubuntu)

Enviado em 03/10/2007 - 17:48h

isso ae acontence porque o getchar apesar de retornar apenas o caractere pressionado, ele pega todo o buffer do teclado pare ler, ou seja... ao digitar o 1 e o [enter] vc digitou 2 teclas, 1 e \n

eu resolvou isso assim
system("stty echo raw");
opcao = getchar();
system("stty echo -raw");

assim ele nau espera o enter...toda vez que voce pressionar uma tecla, ele executa uma ação...
o segundo system volta o shell ao normal...

funciona perfeitamente em linux, em windows a função getch faz isso

abraços


3. Re: Problema função scanf

Reis
gnu_reis

(usa Slackware)

Enviado em 03/10/2007 - 18:05h

Cara, realmente deu certo no linux, mas pq isso acontece com a função scanf, tanto no linux quanto no windows. Valeu pela info!


4. Re: Problema função scanf

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 03/10/2007 - 18:27h

Como dito, o scanf le o caractere mas não le o Enter.
Tem várias formas de contornar isto e uma delas é a configuração do terminal como proposta acima.

Com a ressalva que esta configuração pode ser feita por chamadas de sistema ao invés do system.

Mas tem uma maneira ainda mais fácil:

if (letra == '\n') continue;


5. Re: Problema função scanf

Andi
upc0d3

(usa Gentoo)

Enviado em 03/10/2007 - 18:48h

depois do scanf(), eh soh colocar um...

fflush(stdin);
//isso limpa o buffer da entrada padrao
na função scanf(), a entrada padrão é o teclado.
entaum akela função limpa o buffer do teclado.

flouuuuu...

OBS: no turboC++, a função é flushall();


6. fflush

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 03/10/2007 - 18:59h

Em nome da boa programação, NÃO USE fflush!

Ele esvazia completamente o buffer, que neste caso, NESTE CASO ESPECÍFICO é desejável e funciona.

Mas pegar a mania de fflush é um perigo.

Ai o cara chama o programa:

programa < digitados.txt

Onde o que seria lido, vai ser lido do arquivo e não do teclado. O primeiro fflush MATA TUDO QUE TU TEM. Péssima ideia.

Ou se tu estás programando por sockets onde estás lendo de uma conexão de internet...

O melhor mesmo é tratar a entrada de dados, se for um '\n', descarta.




7. Re: Problema função scanf

Andi
upc0d3

(usa Gentoo)

Enviado em 03/10/2007 - 19:53h

Muito Obrigado ELGIO, pela crítica construtiva.


8. Re: Problema função scanf

Reis
gnu_reis

(usa Slackware)

Enviado em 03/10/2007 - 22:09h

Desculpe por estender o assunto, é que me apareceu outra curiosidade. Nessa mesma situação quando ao invés do tipo char uso o tipo int, scanf("%d",&opcao);, esse problema não acontece, mas com um detalhe, se for digitado errado, como uma letra, por exemplo, o programa entra em loop infinito.

Fico agradecido pela ajuda camaradas!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts