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

Publicado por André em 02/09/2009

[ Hits: 15.772 ]

Blog: http://127.0.0.1

 


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



Muita gente se pergunta: Porque meu getchar(); é ignorado? Estou tentando utilizar a função getchar() para pausar o programa ou para ler um único caractere, mas não está funcionando! Se eu utilizar dois getchar(), um após o outro, funciona... mas por quê?

Explicando:

Isso vai ocorrer quando o programa faz apenas uma ou mais leituras de teclado antes de chamar a função getchar(). Funções como scanf(), gets(), getline(), a classe std::cin e até mesmo getchar() só lêem do teclado os dados que lhes interessam, deixando no buffer de entrada qualquer coisa a mais. Por exemplo, o seguinte trecho de código:

scanf("%d", &num);

Isso vai ler do teclado somente os caracteres que fazem parte de um número inteiro. Fará com que um '\n', correspondente ao ENTER que o usuário pressiona depois de digitar o número, seja abandonado no buffer de entrada. Se a função getchar() for chamada, ela irá ler esse '\n' ao invés de esperar pelos próximos dados do usuário.

Solução em C

Acrescente um \n no final da string de leitura do scanf(). Como por exemplo:

scanf("%d\n", &num);

Isso fará com que o \n correspondente ao ENTER seja lido.

Também é altamente aconselhável que você abandone a função gets() e passe a usar a função fgets();.

E também aconselho que você troque a função getchar() por scanf("%c\n").

Outras dicas deste autor

Switch em C, e se a opção for inválida?

Prism - Transforme sites em aplicativo

Try Python: Interpretador Python online

Evitando bruteforce de SSH utilizando o Fail2ban

Java: Lendo a entrada do teclado

Leitura recomendada

Instalação do editor xwpe - Debian

Obtendo a data e a hora de compilação em C

Corrigindo o erro: C compiler cannot create executables

Fatorial usando recursividade

Função recursiva para inverter um vetor de caracteres

  

Comentários
[1] Comentário enviado por azraelm em 20/12/2009 - 08:52h

Cara valeu pela dica, tava pirando aqui pra entender essa [*****]. o/

[2] Comentário enviado por zettaflop1021 em 07/06/2011 - 00:04h

Por que trocar getchar() por scanf("%c\n") e gets() por fgets()?

[3] Comentário enviado por zettaflop1021 em 07/06/2011 - 00:06h

Outra solução é limpar o buffer de entrada com o uso da função fflush() e passado o valor stdin a ela, antes de usar a getchar(), ficando assim:

fflush(stdin);
getchar();

[4] Comentário enviado por davimendes em 28/09/2011 - 11:22h

Véi, EU TE AMO CARA!!!!

Meu professor tinha ensinado o fflush(stdin) pra gente, mas sabe lá my God o porque isso nunca funcionou no meu computador e em mais metade da sala...

[5] Comentário enviado por WhiteHawk em 03/01/2012 - 09:15h

Boa dica!

@davimendes, a função "fflush" é específica para Windows, portanto ela não funciona no Linux. Se quiseres limpar o buffer no Linux, utilize a seguinte função: "__fpurge(stdin)".

Até mais.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts