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

Publicado por André em 02/09/2009

[ Hits: 15.823 ]

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

Orientação a objetos com a linguagem Ruby

Rodando diversos formatos de vídeo sem problemas em seu Debian

Metasploit Framework no Linux

Java: Lendo a entrada do teclado

Waybackmachine: Relembre os velhos tempos

Leitura recomendada

Pressionar tecla e não precisar pressionar ENTER

Recursão em C

Série de Fibonacci usando recursividade em linguagem C

Acessando um valor dada sua posição numa matriz bidimensional

Curso de C online

  

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