Я не могу сбросить 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 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. Почему?
Input:
123 456 789
Вывод:
123 456
89
Почему я получаю это 89 как выход?
Ответы
Ответ 1
Я считаю, что fflush используется только с выходными потоками.
Вы можете попробовать fpurge или __fpurge в Linux. Обратите внимание, что fpurge нестандартен и не переносится. Он может быть недоступен для вас.
Из Страница руководства Linux fpurge: Обычно ошибочно нужно отказаться от входных буферов.
Самое портативное решение для промывки stdin, вероятно, будет состоять из следующих строк:
int c;
while ((c = getchar()) != '\n' && c != EOF);
Ответ 2
Из часто задаваемых вопросов о comp.lang.c:
Ответ 3
int c;
while((c = getchar()) != '\n' && c != EOF);
Как я очистил входной буфер.
Ответ 4
Как очистить stdin?
Поток потока очистки вызывает Undefined Поведение. Не пытайтесь.
Вы можете только очищать выходные потоки.
Ответ 5
Вы отменяете последний элемент ввода в arg
с помощью '\0'
. Эта строка должна быть arg[i]='\0';
вместо этого (после ошибки и проверки границ вам не хватает.)
Другие уже прокомментировали часть промывки.
Ответ 6
В Windows вы можете использовать перемотку (stdin) fuction.
Ответ 7
Вы не можете очистить 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] = '\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.