Как очистить консольный буфер? - PullRequest
3 голосов
/ 01 января 2011

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 01 января 2011

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

int fflush (FILE * 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) неправильный и Очистить буфер ввода .

1 голос
/ 02 мая 2014

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

fflush(NULL);

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

1 голос
/ 01 января 2011

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

...