Tôi có chương trình sau:
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;
}
Như tác giả của đoạn mã trên đã giải thích: Chương trình sẽ không hoạt động bình thường vì tại Dòng 1, khi người dùng nhấn Enter, nó sẽ để lại trong bộ đệm nhập 2 ký tự: Enter key (ASCII code 13)
và \n (ASCII code 10)
. Do đó, tại Dòng 2, nó sẽ đọc \n
và sẽ không đợi người dùng nhập một ký tự.
OK, tôi hiểu rồi. Nhưng câu hỏi đầu tiên của tôi là: Tại sao getchar()
( ch2 = getchar();
) thứ hai không đọc ký tự Enter key (13)
chứ không phải \n
?
Tiếp theo, tác giả đề xuất 2 cách để giải quyết các thăm dò đó:
sử dụng
fflush()
viết một hàm như thế này:
void clear (void) { while ( getchar() != '\n' ); }
Mã này thực sự hoạt động. Nhưng tôi không thể tự giải thích nó hoạt động như thế nào? Bởi vì trong câu lệnh while, chúng ta sử dụng getchar() != '\n'
, nghĩa là đọc bất kỳ ký tự đơn lẻ nào ngoại trừ '\n'
? nếu vậy, trong bộ đệm đầu vào vẫn còn '\n'
ký tự?