我有以下的程式:
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;
}
正如上述代码的作者所解释的那样:
程序无法正常工作,因为在第1行当用户按下Enter键时,它会在输入缓冲区中留下2个字符:Enter
键(ASCII码13)和\n
(ASCII码10)。因此,在第2行中,它将读取\n
,而不会等待用户输入字符。
好的,我明白了。但我的第一个问题是:为什么第二个getchar()
(ch2 = getchar();
)不读取Enter key (13)
,而是读取\n
字符?
接下来,作者提出了两种解决此类问题的方法:
使用
fflush()
编写一个像这样的函数:
void
clear (void)
{
while ( getchar() != '\n' );
}
这段代码实际上是有效的。但我无法解释它是如何工作的。因为在 while 语句中,我们使用了 getchar() != '\n'
,这意味着读取除了 '\n'
以外的任何单个字符?如果是这样,那么 '\n'
字符是否仍然留在输入缓冲区中?
\r
)。当你按下Enter键时,根据你的系统,它可能会发出\r
(旧版Mac系统),\r\n
(Windows)或\n
(几乎所有其他操作系统,包括OSX/macOS)。已经有答案解释了C运行时如何在文本模式流中将Windows的\r\n
折叠成\n
。 - ShadowRanger