我无法刷新标准input

如何刷新stdin

为什么它不能在下面的代码片段中工作?

#include <string.h> #include <stdio.h> #include <malloc.h> #include <fcntl.h> int main() { int i=0,j=0, sat; char arg[256]; char * argq; argq = malloc(sizeof(char)*10); printf("Input the line\n"); i=read(0, arg, sizeof(char)*9); arg[i-1]='\0'; fflush(stdin); i=read(0, argq, sizeof(char)*5); argq[i-1]='\0'; puts(arg); puts(argq); return 0; } 

现在,如果我把input作为11个字符,只能读取9,但标准input中剩余的两个字符不会刷新,并在argq中再次读取。 为什么?

input:123 456 789

产量:123 456 89

为什么我得到这个89作为输出?

我相信fflush只能用于输出stream。

您可以在Linux上尝试fpurge或__fpurge 。 请注意,fpurge是非标准的,不可移植的。 它可能不适用于您。

从Linux fpurge手册页 :通常放弃input缓冲区是一个错误。

用于刷新标准input的最便携的解决scheme可能是沿着以下几条线:

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

从comp.lang.c常见问题,请参阅:

  • 如何刷新未决input,以便在下次提示时不读取用户的键入命令? fflush(stdin)会工作吗?
  • 如果fflush不起作用,我可以使用什么来刷新input?
 int c; while((c = getchar()) != '\n' && c != EOF); 

是我如何清除input缓冲区。

如何刷新stdin?

刷新inputstream正在调用未定义的行为。 不要尝试。

您只能刷新输出stream。

您正在用'\0'覆盖arginput的最后一个元素。 该行应该是arg[i]='\0'; 相反(错误和边界检查后,你是错过了。)

其他的已经评论了冲洗部分。

在Windows中,您可以使用倒带(stdin)function。