Альтернатива библиотечной функции C fflush(stdin)

Может кто-нибудь объяснить, как можно объяснить следующий код, я действительно не понимаю.

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

Я знаю, что он используется для сброса входного потока и что его можно заменить стандартной библиотечной функцией C:

fflush(stdin)

2 ответа

Решение
while((c = getchar()) != '\n' && c != EOF);

Это читает входные символы, пока не достигнет конца строки (т.е. getchar() возвращенный '\n) или конец файла или состояние ошибки (т. е. getchar() возвращенный EOF).

Если stdin читает с клавиатуры, он отменяет ввод, пока вы не нажмете Enter.

Оставляя EOF Проверка может дать вам бесконечный цикл, если есть ошибка ввода или если вы запускаете условие конца файла (в Unix, дважды нажав Ctrl-D).

Это может быть полезно, например, после использования scanf() читать целое число. Если вы выполните scanf("%d", &num); и введите 123, он будет читать эти 3 цифры (и сохранить значение 123 в n), но оставьте все после этого в ожидании чтения. Приведенную выше строку можно использовать для пропуска оставшейся части строки ввода.

(Альтернатива, вероятно, лучшая, состоит в том, чтобы читать целые строки, используя fgets() и разобрать их, используя sscanf().)

Это не эквивалентно fflush(stdin), Что касается стандарта C, fflush во входном потоке имеет неопределенное поведение.

Некоторые реализации определяют поведение fflush(stdin), В системах, которые используют GNU libc, например (большинство систем Linux):

Для входных потоков, fflush() отбрасывает любые буферизованные данные, которые были извлечены из базового файла, но не были использованы приложением.

Это не то же самое, что отбрасывать ввод до конца строки. И использование этого делает ваш код непереносимым.

Этот код, предполагая, что файл (или другой ввод) был открыт, будет продолжать получать символ за символом, пока не найдет символ новой строки (\n) или конец файла (eof).

fflush просто очистит поток для открытого файла.

Другие вопросы по тегам