gpt4 book ai didi

c - 如何在 fgets 循环中正确刷新标准输入

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

我在这里找到了几次使用 while((c = getchar()) != '\n' && c != EOF) 清除 stdin 的示例,并尝试使用它在一个通过 fgets 获取输入的循环中。我需要刷新,因为循环从最后一个输入中获取\n 字符并再次运行它。

所以现在我必须按两次回车键。为什么会发生这种情况,我该如何解决?

#define BUFFER_LIMIT 50
do
{
int c;
while ((c = getchar()) != '\n' && c != EOF);

printf("console> ");
fgets(input_buffer, BUFFER_LIMIT-1, stdin);

if(do_something(input_buffer))
break;
} while(strncmp(input_buffer, "quit", 4) != 0);

最佳答案

不幸的是,在 C 语言中存在很多关于“刷新输入”的混淆。这种混淆几乎完全来自关于流行但有缺陷的 scanf 函数的一个奇怪事实:它通常做 < em>不读取整行输入,它通常在转换输入后在输入流上留下换行符\n。例如,如果你写了一个程序说

printf("Type a number:\n");
scanf("%d", &n);

如果用户键入“123”并按下 Return 键,数字 123 将存储到变量 n 中,但是 \n 字符对应于 Return 键的将留在输入流中。如果您的程序接下来要做的是调用 fgetsgetchar,假设您将开始读取用户键入的下一行输入,您的程序将立即改为阅读剩下的换行符。用户似乎输入了一个额外的空白行或其他内容。

这个问题非常普遍。大量初学 C 的程序员都被它困住了。简而言之,推荐三种修复方法:

  1. 在调用像 scanf 这样的函数之后,将换行符留在输入缓冲区中,在调用像 getcharfgets 这样的函数之前> 希望在一个新行开始,使用小循环 while((c = getchar()) != '\n' && c != EOF) 读取并丢弃 scanf 留在输入缓冲区。

  2. 根本不要使用 scanf,或者如果您这样做,也不要尝试将它与 getcharfgets< 的调用混合使用.

  3. (流行但问题严重)调用 fflush(stdin) 刷新不需要的输入。

#3 的问题已被广泛讨论,因此我不会再多说那些问题或解决方案。推荐的“可移植”替代方案是 #1,但它显然只有在输入中至少有一个不需要的换行符等待刷新时才有效。否则,解决方案 #1 将错误地读取并丢弃一行想要的输入。

所以你不能到处使用#1。你不能把它随意地撒在你的程序中;您不能在可能使用过 fflush(stdin) 的任何地方使用它。通常,如前所述,您仅在调用 scanf 之后和调用 getcharfgets 之前才需要它。

在问题的代码片段中,可能根本不需要使用解决方案#1。 fgets 函数本身就完全能够清晰地读取各个输入行。不需要额外刷新输入或丢弃换行符。 (但是,如果在 do_something() 下调用了 scanf,则可能需要额外的换行处理。)

关于c - 如何在 fgets 循环中正确刷新标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219549/

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