Как очистить входной буфер в C? - PullRequest
67 голосов
/ 26 октября 2011

У меня есть следующая программа:

int main(int argc, char *argv[])
{
  char ch1, ch2;
  printf("Input the first character:"); // Line 1
  scanf("%c", &ch1); 
  printf("Input the second character:"); // Line 2
  ch2 = getchar();

  printf("ch1=%c, ASCII code = %d\n", ch1, ch1);
  printf("ch2=%c, ASCII code = %d\n", ch2, ch2);

  system("PAUSE");  
  return 0;
}

Как объяснил автор вышеприведенного кода: Программа не будет работать должным образом, потому что в строке 1, когда пользователь нажимает Enter, она уходит ввходной буфер 2 символа: Enter key (ASCII code 13) и \n (ASCII code 10).Поэтому в строке 2 он будет читать \n и не будет ждать, пока пользователь введет символ.

ОК, я понял.Но мой первый вопрос: почему второй getchar() (ch2 = getchar();) не читает символ Enter key (13), а не \n?

Далее автор предложил 2 способа решения таких проблем:

  1. использовать fflush()

  2. написать такую ​​функцию:

    void
    clear (void)
    {    
      while ( getchar() != '\n' );
    }
    

Thisкод работал на самом деле.Но я не могу объяснить себе, как это работает?Поскольку в операторе while мы используем getchar() != '\n', это означает чтение любого отдельного символа, кроме '\n'?если так, во входном буфере все еще остается символ '\n'?

Ответы [ 11 ]

0 голосов
/ 13 июля 2017

Short, переносимый и объявленный в stdio.h

stdin = freopen(NULL,"r",stdin);

Не застревает в бесконечном цикле, когда на stdin нет ничего для сброса, как в следующей хорошо известной строке:

while ((c = getchar()) != '\n' && c != EOF) { }

Немного дороже, поэтому не используйте его в программе, которой необходимо многократно очищать буфер.

Украдено у коллеги:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...