如何刷新标准输入 ?
为什么不能在下面的代码片段工作?
#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;
}
现在,如果我给的输入为11个字符,只有9应该读,但在标准输入剩下的两个字符不冲洗,并在argq再次读取。 为什么?
输入:123 456 789
输出:123 456 89
为什么我会得到这个89作为输出?
我相信fflush只输出流中。
您可以尝试fpurge或__fpurge在Linux上。 需要注意的是fpurge是非标准,不便于携带。 它可能不是提供给您。
从Linux的fpurge手册页 :通常它是要放弃输入缓冲器一个错误。
冲厕标准输入的最轻便的解决方案可能会沿着以下线的东西:
int c;
while ((c = getchar()) != '\n' && c != EOF);
int c;
while((c = getchar()) != '\n' && c != EOF);
是我怎么会清除输入缓冲区。
要覆盖在输入的最后一个元素arg
用'\0'
。 该行应该被arg[i]='\0';
代替(后误差和边界检查你缺少。)
对方已经评论冲洗部分。
没有碰到的情况,该命令将启动在某些情况下,等待输入,不能清洗在linux标准输入。 解决这个问题的方法是用readLineToStdString(),以取代所有的std :: CIN:
void readLine(char* input , int nMaxLenIncludingTerminatingNull )
{
fgets(input, nMaxLenIncludingTerminatingNull , stdin);
int nLen = strlen(input);
if ( input[nLen-1] == '\n' )
input[nLen-1] = '\0';
}
std::string readLineToStdString(int nMaxLenIncludingTerminatingNull)
{
if ( nMaxLenIncludingTerminatingNull <= 0 )
return "";
char* input = new char[nMaxLenIncludingTerminatingNull];
readLine(input , nMaxLenIncludingTerminatingNull );
string sResult = input;
delete[] input;
input = NULL;
return sResult;
}
这也将让你在给std :: cin字符串输入空格。
在Windows中可以使用快退(标准输入)机能的研究。