Я не могу смыть stdin

Как промыть 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 linen");
        i=read(0, arg, sizeof(char)*9);
        arg[i-1]='';
        fflush(stdin);

        i=read(0, argq, sizeof(char)*5);
        argq[i-1]='';

        puts(arg);
        puts(argq);

        return 0;
}

теперь, если я дам ввод как 11 символов, только 9 должны быть прочитаны, но оставшиеся два символа в stdin не сбрасываются и не читаются снова в argq. Почему?

вход: 123 456 789

выход: 123 456 89

почему я получаю этот 89 в качестве вывода?

7 ответов


Я считаю, что fflush используется только с выходными потоками.

вы можете попробовать fpurge или __fpurge на Linux. Обратите внимание, что fpurge нестандартен и не переносится. Она может быть недоступна для вас.

С Linux fpurge man page: обычно это ошибка, чтобы отказаться от входных буферов.

самым портативным решением для промывки stdin, вероятно, будет что-то вроде следующий:

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


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

- это то, как я очищаю входной буфер.


Как очистить stdin??

промывка входных потоков вызывает неопределенное поведение. Не пытайтесь.

вы можете только очистить выходные потоки.


вы переопределяете последний элемент ввода в arg с ''. Эта строка должна быть arg[i]='


в Windows, вы можете использовать перемотка назад (stdin) fuction.


вы не можете очистить stdin в Linux, не натыкаясь на сценарии, которые команда начнет ждать ввода в некоторых случаях. Способ его решения-заменить все std:: cin на readLineToStdString ():

void readLine(char* input , int nMaxLenIncludingTerminatingNull )
{
    fgets(input, nMaxLenIncludingTerminatingNull , stdin);

    int nLen = strlen(input);

    if ( input[nLen-1] == '\n' )
        input[nLen-1] = '';
}

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.