flushall()无法正常工作 - 在C语言中

3
我必须使用getchar()函数一个接一个地获取许多字符。
在使用该函数后,我必须清除缓冲区,但是flushall()函数不能做到这一点。在第二次迭代该函数时,它将'\n'作为输入。我尝试过使用fflush()_flushall(),但都没有成功。这是什么原因呢?请帮忙解答。
注意:我必须使用getchar()函数。
int i;
char c;
for (i = 0; i < 5; i++)
{
    c = getchar();      
    printf("%c", c);
    _flushall();
}

你的代码在哪里?而且你试图做什么还不清楚。 - Eugene Sh.
1
_flushall; => _flushall();。你并没有调用这个函数,只是在评估(和丢弃)指向它的指针。 - John Bode
John Bode,_flushall()不起作用。alk,为什么我必须写这么多代码而不能使用flush? - Asher
3
因为stdio中的"flushing"并不是你想象的意思。它并不是指“取出输入缓冲区中的任何数据并将其丢弃”。它实际上的含义是“取出输出缓冲区中的任何数据,并确保它被写入到应该去的地方”。 - Steve Summit
2个回答

2
如果您想要清除输入缓冲区中的垃圾数据,一个好的方法是:
int c;
do c = getchar(); while (c != EOF && c != '\n');

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

如果您正在尝试编写一个程序,以响应用户按下每个单个按键,那么这对您无效,但这是因为整个 stdio.h 接口对您无效;您需要使用其他东西,例如ncurses 或 GUI“小部件”库。


0

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

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

  2. 如果输入缓冲区中有字符,它会清除它们而不等待按下回车键。

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

这是我的解决方案

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接