paulo1205
(usa Ubuntu)
Enviado em 25/08/2014 - 21:10h
Tenho uma observação sobre o código marcado como "melhor resposta", pois ele está errado.
void limparBuffer(void){
char c;
while((c = getchar()) != '\n' && c != EOF);
}
A função
getchar() devolve um valor do tipo
int, não do tipo
char. Um dos motivos para que seja assim é justamente a sinalização de erros.
A documentação da função
fgetc(), que é o motor por trás de
getchar(), diz o seguinte (em tradução livre e comentada):
fgetc() lê o próximo caráter do fluxo [de entrada] e o retorna como um unsigned char convertido [expandido] para int, ou EOF [cujo valor é -1] ao final do arquivo ou em erro.
Por motivos históricos, o tipo
char não armazena apenas caracteres, mas também inteiros representáveis com um único byte. Esses inteiros tipicamente têm oito bits e podem ser com sinal (
signed char, variando de -128 a 127) ou sem sinal (
unsigned char, variando de 0 a 255). Quando não se especifica nem
signed nem
unsigned, o comportamento
default depende da arquitetura, mas nossos PCs trabalham com bytes com sinal.
Se você tentar atribuir o valor de retorno de
fgetc() ou
getchar() a uma variável com largura de apenas um byte com sinal, estará tornando indistinguível o EOF do byte ou caráter que tem todos os bits iguais a 1 (por exemplo, o caráter 'ÿ' no conjunto de caracteres ISO-8859-1 ou Windows CP1252). Se o atribuir a um byte sem sinal, o EOF vai ser truncado para caber em oito bits, e vai se tornar o byte sem sinal com valor 255. No primeiro caso, o
loop acima pode parar antes da hora, se encontrar um byte válido, mas que se confunde com EOF ao comparar o byte -1 (ou o caráter 'ÿ') com o inteiro -1. No segundo, o
loop pode nunca terminar por chegar ao fim do arquivo, pois 255 não vai ser igual nem a '\n' (10) nem
EOF (-1).
A forma correta seria declarar
c como
int.