我无法刷新标准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'
覆盖arg
input的最后一个元素。 该行应该是arg[i]='\0';
相反(错误和边界检查后,你是错过了。)
其他的已经评论了冲洗部分。
在Windows中,您可以使用倒带(stdin)function。