如何刷新标准输入?
为什么它不能在以下代码段中工作?
#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个,但stdin中剩余的两个字符不会被刷新并在argq中再次读取。为什么呢?
输入: 123 456 789
输出: 123 456 89
为什么我将这89作为输出?
答案 0 :(得分:32)
我相信fflush仅用于输出流。
您可以在Linux上尝试fpurge或__fpurge。请注意,fpurge是非标准的,不可移植。它可能无法使用。
来自Linux fpurge man page:通常想丢弃输入缓冲区是错误的。
用于刷新stdin的最便携式解决方案可能类似于以下内容:
int c;
while ((c = getchar()) != '\n' && c != EOF);
答案 1 :(得分:12)
从comp.lang.c FAQ中,请参阅:
答案 2 :(得分:10)
int c;
while((c = getchar()) != '\n' && c != EOF);
我是如何清除输入缓冲区的。
答案 3 :(得分:3)
如何刷新stdin?
刷新输入流正在调用未定义的行为。不要试试。
您只能刷新输出流。
答案 4 :(得分:2)
您正在使用arg
覆盖'\0'
中输入的最后一个元素。该行应该是arg[i]='\0';
而不是(在错误和边界检查之后你缺少。)
其他已经评论过冲洗部分。
答案 5 :(得分:0)
您无法在Linux中清除stdin,而不会遇到命令在某些情况下开始等待输入的情况。解决它的方法是用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 string中输入空格。
答案 6 :(得分:-1)
在Windows中,您可以使用快退(stdin)功能。