【问题标题】:flushall() doesn't work - in Cflushall() 不起作用 - 在 C 中
【发布时间】:2018-03-04 05:55:16
【问题描述】:

我必须使用getchar() 函数一一获取许多字符。

我必须在使用该功能后清理缓冲区,但flushall() 不这样做。在函数的第二次迭代之后,它得到'\n' 作为输入。我尝试使用fflush()_flushall(),但没有人成功。这是什么原因?请帮忙。

注意:我必须使用getchar()

int i;
char c;
for (i = 0; i < 5; i++)
{
    c = getchar();      
    printf("%c", c);
    _flushall();
}

【问题讨论】:

  • 你的代码在哪里?目前还不清楚您要做什么。
  • _flushall; => _flushall();。您实际上并没有调用该函数,您只是在评估(并丢弃)指向它的指针。
  • 约翰·博德,_flushall() 不起作用。好吧,为什么我必须写所有这些而不是使用flush?
  • 谢谢!这样可行!我仍然很想知道为什么冲洗不起作用。有人可以帮忙吗?
  • @Asher 因为 stdio 中的“刷新”并不代表您的想法。它确实不是的意思是,“把输入缓冲区中的任何东西都拿走,然后扔掉。”它的实际意思是“获取 output 缓冲区中的任何内容,并确保将其实际写入应该去的地方。”

标签: c input buffer flush getchar


【解决方案1】:

我实施了一个智能解决方案来清除输入缓冲区。 该解决方案有 3 个优点:

  1. 如果输入缓冲区中没有任何内容,它不会阻塞。

  2. 如果输入缓冲区中有字符,它会清除它们并且不等待按 Enter。

  3. 输入缓冲区中的字符(作为用户单击键盘的结果)将不会显示在屏幕上。

这是我的解决方案

#include <conio.h>
#include <Windows.h>

void my_flushall()
{
    while (_kbhit())_getch(); // flushall
}

【讨论】:

    【解决方案2】:

    如果你想丢弃输入缓冲区中的垃圾,一个好方法是

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

    这将丢弃直到并包括下一个换行符或文件结尾,这通常是你想要的。

    如果您正在尝试编写一个在用户按下每个键时响应单个键击的程序,这对您不起作用,但这是因为整个stdio.h 界面对您不起作用;您将需要使用其他东西,例如 ncurses 或 GUI“小部件”库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2015-09-08
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多