gpt4 book ai didi

c - 如何清除 C 中的输入缓冲区?

转载 作者:太空狗 更新时间:2023-10-29 16:16:09 24 4
gpt4 key购买 nike

我有以下程序:

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 key (ASCII code 13)\n (ASCII code 10)。因此,在第 2 行,它将读取 \n 并且不会等待用户输入字符。

好的,我明白了。但我的第一个问题是:为什么第二个 getchar() (ch2 = getchar();) 没有读取 Enter key (13) , 而不是 \n 字符?

接下来,作者提出了两种解决此类问题的方法:

  1. 使用fflush()

  2. 像这样写一个函数:

    void
    clear (void)
    {
    while ( getchar() != '\n' );
    }

这段代码确实有效。但我无法解释自己它是如何工作的?因为在while语句中,我们使用了getchar() != '\n',也就是说读取除'\n'之外的任意一个字符?如果是这样,在输入缓冲区中仍然保留 '\n' 字符?

最佳答案

The program will not work properly because at Line 1, when the user presses Enter, it will leave in the input buffer 2 character: Enter key (ASCII code 13) and \n (ASCII code 10). Therefore, at Line 2, it will read the \n and will not wait for the user to enter a character.

您在第 2 行看到的行为是正确的,但这并不是正确的解释。对于文本模式流,您的平台使用什么行结尾(回车 (0x0D) + 换行 (0x0A)、裸 CR 或裸 LF)并不重要。 C 运行时库将为您处理:您的程序将只看到 '\n' 换行符。

如果您键入一个字符并按下回车键,那么该输入字符将在第 1 行读取,然后 '\n' 将在第 2 行读取。参见 I'm using scanf %c to read a Y/N response, but later input gets skipped.来自 comp.lang.c FAQ。

至于建议的解决方案,请参阅(再次来自 comp.lang.c FAQ):

这基本上说明了唯一可移植的方法是:

int c;
while ((c = getchar()) != '\n' && c != EOF) { }

您的 getchar() != '\n' 循环之所以有效,是因为一旦您调用 getchar(),返回的字符就已经从输入流中移除。

此外,我觉得有义务阻止您完全使用 scanf:Why does everyone say not to use scanf? What should I use instead?

关于c - 如何清除 C 中的输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com