Linux手册建议不要使用fflush
功能。
因此,我发现while( getchar() != '\n'
扮演的角色与fflush(stdin)
相同。
e.g。)
我的试用代码:
#include <stdio.h>
void main(void)
{
char input[100] = {};
printf("abcd");
while(1);
}
如果我在Linux(Ubuntu)中执行上面的代码,结果什么都没有。因为\n
不在字符串中。所以,我必须通过清空stdout
缓冲区来打印它们。
奇怪的现象是,当我使用getc(stdout)
或getc(stdin)
时,打印效果会很好。
#include <stdio.h>
void main(void)
{
char input[100] = {};
printf("abcd");
getc(stdout); // or getc(stdin); both working well.
while(1);
}
我不知道为什么两者都做得很好。我希望只有getc(stdout)
才能正常运行,因为我将stdin
视为键盘缓冲区,将stdout
视为监视缓冲区。
答案 0 :(得分:2)
仔细阅读fflush(3)的文档(对于输入流,它只对可搜索文件有记录的效果,而不是 stdin 作为终端时)。 AFAIK,fflush(stdin)
是未定义的行为(当 stdin 是终端时),当然不会像
while( getchar() != '\n'
;您应该在某些输出 fflush
句柄或FILE*
NULL
如果您在fflush(NULL);
繁忙的等待循环之前添加fflush(stdout);
或while(1);
来电,那么您的第一个示例将按预期工作(实际上,您应该在其中调用sleep(3)循环,至少避免加热你的处理器。)
请注意, stdin 可以(在Linux上)是tty(4),或文件或pipe(7)(例如,使用shell重定向或管道)等等....
终端,即ttys,主要是出于历史原因 - 非常复杂的事情。阅读tty demystified页面。在许多情况下,你有一些 double 缓冲:内核通过它的line discipline缓冲tty,而C standard library正在缓冲 stdin 。见setvbuf(3)。当然tty不是键盘(但它上面有一些抽象)。很可能,在您的Linux桌面上,X11服务器仅 读取物理键盘。
如果您关心来自终端的交互式输入,请考虑使用某些库,例如ncurses或readline
第二种情况的行为可以通过以下事实来解释:在从 stdin 读取之前,某些C标准库隐式地刷新 stdout ,但AFAIK不保证这一点,你当然应该在需要时明确地 fflush
(特别是出于可读性原因)!
阅读getc(3)的文档,它可能会失败(可能会因stdout
而失败)。
答案 1 :(得分:-1)
你可以使用setbuf(stdout,NULL);函数调用获得与fflush(stdin)相同的效果。