Как очистить буфер консоли?

у меня есть код, который запускается повторно:

printf("вы хотите продолжить? Д/Н: \n");
keepplaying = getchar();

в следующем мой код работает, он не ждет ввода. я узнал, что getchar в секунду использует '\ n' в качестве символа. я предполагаю, что это связано с некоторым буфером, который есть у sdio, поэтому он сохраняет последний ввод, который был «Y\n» или «N\n».

мой вопрос: как очистить буфер перед использованием getchar, что заставит getchar ждать моего ответа?


person DoronS    schedule 01.01.2011    source источник
comment
Вы используете C или C++? Это не один и тот же язык.   -  person Cody Gray    schedule 01.01.2011


Ответы (3)


Сброс входного потока вызывает неопределенное поведение.

int fflush(ФАЙЛ *ostream);

ostream указывает на поток вывода или поток обновления, в котором не была введена самая последняя операция, функция fflush заставляет любые незаписанные данные для этого потока доставляться в хост-среду для записи в файл; в противном случае поведение не определено.

Чтобы правильно очистить входной поток, сделайте что-то вроде следующего:

int main(void)
{
  int   ch;
  char  buf[BUFSIZ];

  puts("Flushing input");

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

  printf ("Enter some text: ");

  if (fgets(buf, sizeof(buf), stdin))
  {
    printf ("You entered: %s", buf);
  }

  return 0;
}

См. Почему fflush(stdin) неверен и Очистить входной буфер.

person Robert Groves    schedule 01.01.2011
comment
вот что я сделал, я просто хотел знать, есть ли более простой способ - person DoronS; 01.01.2011
comment
Более простой способ - использовать fflush, который может работать не во всех средах и не во всех ситуациях. - person taskinoor; 01.01.2011
comment
Вы можете использовать библиотеки, характерные для вашей платформы, для обработки пользовательского ввода (WIN32, GTK, ncurses и т. д.), которые скроют от вас такие детали. - person Robert Groves; 01.01.2011

используйте fflush() и flushall() перед printf

person Sudhakar Singh    schedule 01.01.2011

Насколько я знаю, flushall не POSIX. Для того, чтобы стандартным образом сбросить консольный буфер, вы можете просто использовать команду:

fflush(NULL);

Эта тема кажется немного старой, но я надеюсь, что это все еще может помочь другим.

person kevin.bui    schedule 02.05.2014