我无法冲洗stdin

问题描述 投票:15回答:7

如何刷新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;
}

现在,如果我将输入作为11个字符,则只应读取9个,但是stdin中剩余的两个字符不会被刷新并在argq中再次读取。为什么?

输入:123 456 789

产出:123 456 89

为什么我将这89作为输出?

c stdin fflush
7个回答
32
投票

我相信fflush仅用于输出流。

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

来自Linux fpurge man page:通常想丢弃输入缓冲区是错误的。

用于刷新stdin的最便携式解决方案可能与以下内容类似:

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


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

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


3
投票

如何刷新stdin?

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

您只能刷新输出流。


2
投票

你用arg覆盖了'\0'中输入的最后一个元素。该行应该是arg[i]='\0';(错误和边界检查后你缺少。)

其他已经评论过冲洗部分。


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字符串中输入空格。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.