我不能刷新标准输入我不能刷新标准输入(I am not able to flush stdin)

2019-05-09 01:36发布

如何刷新标准输入

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

#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作为输出?

Answer 1:

我相信fflush只输出流中。

您可以尝试fpurge或__fpurge在Linux上。 需要注意的是fpurge是非标准,不便于携带。 它可能不是提供给您。

从Linux的fpurge手册页 :通常它是要放弃输入缓冲器一个错误。

冲厕标准输入的最轻便的解决方案可能会沿着以下线的东西:

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


Answer 2:

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

  • 我怎样才能刷新挂起的输入,使用户的预输入不在下一个提示阅读? 将fflush(标准输入)工作?
  • 如果fflush将无法正常工作,我可以用冲洗输入?


Answer 3:

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

是我怎么会清除输入缓冲区。



Answer 4:

如何刷新标准输入?

法拉盛输入流调用是未定义行为。 不要尝试。

你只能刷新输出流。



Answer 5:

要覆盖在输入的最后一个元素arg'\0' 。 该行应该被arg[i]='\0'; 代替(后误差和边界检查你缺少。)

对方已经评论冲洗部分。



Answer 6:

没有碰到的情况,该命令将启动在某些情况下,等待输入,不能清洗在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字符串输入空格。



Answer 7:

在Windows中可以使用快退(标准输入)机能的研究。



文章来源: I am not able to flush stdin
标签: c stdin fflush