Começando logo com um exemplo prático, compile o código abaixo e execute-o.
#include <stdio.h>
int main()
{
int i;
char ch;
for (int i=0; i<4; i++)
{
printf("Caractere: ");
scanf("%c", &ch);
}
return 0;
}
Resultado:
Da para notar que ao digitar o primeiro caractere ‘a’ no nosso caso, ele armazena ‘a’ na variável e quando e pedido pela segunda vez ele pula para a terceira, ou seja passa direto pelo segundo scanf(), por que isso acontece? Isso acontece pois o buffer contém uma “sujeirinha” visto que a função scanf() atribui o “lixo” do buffer para a próxima variável.
O que fazer para evitar esse problema?
Existem diversas soluções.
- A mais simples( é também a que costumo utilizar), adicionar um espaço, desse jeito scanf(” %s”, &var), viram o espaço em branco antes do ‘%’, somente isso já basta para resolver os problemas com o buffer cheio, sem precisar apelar para fgets.
- Utilizar a função getchar() também resolve :)
- Outra opção é fazer o scanf(); mandar o lixo para o espaço: scanf(“%c%*c”, &ch); dessa forma.
- Simplesmente scanf(” %c”, &ch); notem que existe um espaço entre a aspa de abertura e o %c, isso já resolve o problema.
- Mais uma alternativa e usar a função __fpurge(stdin); lembrando para utilizar essa função precisa incluir a lib #include<stdio_ext.h>, se utilizar ela não precisa chamar stdio.h, essa lib só funciona no Linux.
Opções são bastante resta só escolher a que mais gosta e evitar o uso de fflush(stdin).
Por que não usar fflush(stdin)?
Na documentação da função fflush() está escrito: “effect undefined for input streams” (efeitos indefinidos para fluxos de entrada ). Acontece que a função scanf() e uma função de entrada de dados não de saída, se os criadores da função não sabem os possíveis efeitos do uso de fflush em streams de entrada, então acaba não se tornando uma boa pratica de programação é em sistemas unix-like ela não vai limpar o buffer
Referências:
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351
http://forum.imasters.uol.com.br/index.php?/topic/336835-tutorial-systempause-e-fflushstdin/
http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#fflush
http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado
[]‘s


Últimos Comentários