19

How to flush the stdin??

Why is it not working in the following code snippet?

#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;
}

Now if i give the input as 11 characters, only 9 should be read but the remaining two characters in the stdin are not flushed and read again in the argq. Why?

Input: 123 456 789

Output: 123 456 89

Why am i getting this 89 as the output?

4

7 回答 7

39

我相信 fflush 仅用于输出流。

您可以在 Linux 上尝试fpurge__fpurge。请注意, fpurge 是非标准的且不可移植。您可能无法使用它。

来自Linux fpurge 手册页:通常想要丢弃输入缓冲区是错误的。

用于刷新标准输入的最便携的解决方案可能类似于以下内容:

int c;
while ((c = getchar()) != '\n' && c != EOF);
于 2010-02-02T20:37:52.707 回答
11
int c;
while((c = getchar()) != '\n' && c != EOF);

是我如何清除输入缓冲区。

于 2012-01-27T01:02:56.587 回答
3

如何刷新标准输入?

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

您只能刷新输出流。

于 2010-02-02T20:36:13.553 回答
2

您正在用 覆盖输入的最后一个arg元素'\0'。那条线应该是arg[i]='\0';(在错误和边界检查之后你丢失了。)

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

于 2010-02-02T20:39:46.303 回答
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 字符串中输入空格。

于 2017-12-24T12:49:33.457 回答
-2

在 Windows 中,您可以使用rewind(stdin)功能。

于 2016-06-03T14:06:18.570 回答