Я не могу сбросить stdin

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

Почему он не работает в следующем fragmentе кода?

#include  #include  #include  #include  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?

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

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

На странице man fpurge Linux : Обычно ошибкой является отказ от входных буферов.

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

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

Из справки comp.lang.c см.:

  • Как я могу очистить ожидающий ввод, чтобы имя пользователя не читалось в следующем приглашении? Будет ли fflush (stdin) работать?
  • Если fflush не будет работать, что я могу использовать для очистки ввода?
 int c; while((c = getchar()) != '\n' && c != EOF); 

Как я очистил входной буфер.

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

Пропускание входных streamов вызывает Undefined Behavior. Не пытайтесь.

Вы можете только очищать выходные streamи.

Вы переопределяете последний элемент ввода в arg с помощью '\0' . Эта строка должна быть arg[i]='\0'; вместо этого (после ошибки и проверки границ вам не хватает.)

Другие уже прокомментировали промывочную часть.

В Windows вы можете использовать функцию rewind (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] = '\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.

  • Сравнить два дерева каталогов
  • Как заставить ssh получить пароль от stdin
  • Чтение Eclipse stdin (System.in) из файла
  • Очистить stdin перед чтением
  • Обнаруживать, является ли stdin терминалом или трубой?
  • Почему я получаю «Необработанный тип исключения IOException»?
  • Как прочитать строку, введенную пользователем в C?
  • Как отправить ввод на консоль, как если бы пользователь печатал?
  • Почему мы не можем читать один символ за раз из System.in?
  • Запуск внешней программы с перенаправленным stdin и stdout из Java
  • Как читать из stdin с помощью fgets ()?
  • Давайте будем гением компьютера.