Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Motorola a1200 + MontaVista Linux
Por codespy
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha


Dica

Getchar(); sendo ignorado? Não mais!
Linux user
Publicado por André em 02/09/2009

Login: andrezc, 1163926 pontos
[ Hits: 3323 ]

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

Leitura recomendada
   Dica Linux recomendada Programando no Ubuntu - aplicações gráficas em C++ com Eclipse e Glade
   Dica Linux recomendada Desenvolvimento com C/C++ e GTK
   Dica Linux recomendada Função recursiva para inverter um vetor de caracteres
   Dica Linux recomendada Instalação do editor xwpe - Debian
   Dica Linux recomendada Checagem de erro do scanf

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

Cara valeu pela dica, tava pirando aqui pra entender essa merda. 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 White Hawk 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


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.