Limpando a "sujeirinha" no buffer do teclado
Dica publicada em C/C++ / Introdução
Limpando a "sujeirinha" no buffer do teclado
Muitas vezes, quando lemos algum dado com scanf(), sobra alguma
"sujeirinha" no buffer do teclado, o que pode levar a erros na execução
do código. Por exemplo, compile e execute este código:
#include <stdio.h>
main()
{
int i;
char ch;
for (i=0; i<5; i++)
{
printf("Caractere: ");
scanf("%c", &ch);
}
return 0;
}
main()
{
int i;
char ch;
for (i=0; i<5; i++)
{
printf("Caractere: ");
scanf("%c", &ch);
}
return 0;
}
Ao executar, você verá que não serão lidos todos os caracteres, visto que a função scanf() atribui o "lixo" do buffer para a próxima variável.
Podemos contornar isso de algumas formas. Uma é incluir uma chamada à função getchar() após a leitura com scanf(). Isso garante a limpeza do buffer, evitando erros. Assim:
#include <stdio.h>
main()
{
int i;
char ch;
for (i=0; i<5; i++)
{
printf("Caractere: ");
scanf("%c", &ch);
getchar();
}
return 0; }
main()
{
int i;
char ch;
for (i=0; i<5; i++)
{
printf("Caractere: ");
scanf("%c", &ch);
getchar();
}
return 0; }
Outra forma é fazer com que o próprio scanf() mande o lixo do buffer para o espaço. Assim:
#include <stdio.h>
main()
{
int i;
char ch;
for (i=0; i<5; i++)
{
printf("Caractere: ");
scanf("%c%*c", &ch); /* perceberam a mudança? */
}
return 0;
}
main()
{
int i;
char ch;
for (i=0; i<5; i++)
{
printf("Caractere: ");
scanf("%c%*c", &ch); /* perceberam a mudança? */
}
return 0;
}
Executem os dois exemplos e você verá que a leitura ocorre sem erros. Agora, basta você escolher qual tática usar.
;)
Abracos
REPOLHO