Mam następujący program:
int main(int argc, char *argv[])
{
char ch1, ch2;
printf("Input the first character:"); // Line 1
scanf("%c", &ch1);
printf("Input the second character:"); // Line 2
ch2 = getchar();
printf("ch1=%c, ASCII code = %d\n", ch1, ch1);
printf("ch2=%c, ASCII code = %d\n", ch2, ch2);
system("PAUSE");
return 0;
}
Jak wyjaśnił autor powyższego kodu: Program nie będzie działał poprawnie, ponieważ w linii 1, gdy użytkownik naciśnie klawisz Enter, pozostawi w buforze wejściowym 2 znaki: Enter key (ASCII code 13)
i \n (ASCII code 10)
. Dlatego w linii 2 odczyta \n
i nie będzie czekać, aż użytkownik wprowadzi znak.
OK, rozumiem. Ale moje pierwsze pytanie brzmi: dlaczego druga getchar()
( ch2 = getchar();
) nie czyta Enter key (13)
, a nie \n
znaku?
Następnie autor zaproponował 2 sposoby rozwiązania takich problemów:
posługiwać się
fflush()
napisz funkcję taką jak ta:
void clear (void) { while ( getchar() != '\n' ); }
Ten kod faktycznie działał. Ale nie potrafię sobie wytłumaczyć, jak to działa? Ponieważ w instrukcji while używamy getchar() != '\n'
, oznacza to przeczytanie dowolnego pojedynczego znaku z wyjątkiem '\n'
? jeśli tak, to w buforze wejściowym nadal pozostaje '\n'
znak?