Понимание "while (getchar ()! = '\ N')" - PullRequest
0 голосов
/ 30 января 2019

Я бы хотел немного лучше понять, как все работает в фоновом режиме в отношении этой команды.

Я начал с попытки предотвратить сбой моего приложения, когда scanf() получил char вместо int ожидалось.Предложенное мне решение состояло в том, чтобы добавить строку while (getchar() != '\n'); для очистки буфера ввода.И это сработало.Отлично!

Но поскольку я иначе использовал scanf(), а не getchar(), меня немного смутило то, что я использую совершенно другую команду для ввода для очистки буфера.

У меня естьЯ немного погуглил, и, насколько я могу судить, getchar() использует stdin, и это буфер, который очищается этой командой.Это также означает, что scanf() также использует stdin в этом случае.

Это предположение верно?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Да, это так.Это явно упоминается в документации.

Цитирование стандарта C11, глава §7.21.6.2

Функция fscanf считывает входные данные из потока, на который указывает stream, под контролем строки, на которую указывает формат, определяющий допустимые входные последовательности и порядок их преобразования для назначения, используя последующие аргументы в качестве указателей на объекты для получения преобразованного ввода.[....]

и глава §7.21.6.4

Функция scanf эквивалентна fscanf с аргументом stdin, вставленным передАргументы scanf.


Просто добавим немного о том, почему вам нужно getchar(), чтобы очистить stdin, когда scanf() также читает из stdin:

scanf() считывает данные только из входного буфера, если сопоставление выполнено успешно, на что указывает формат, определяющий допустимые входные последовательности.В случае сбоя сопоставления, как в вашем случае, указывается char, где ожидается int (наиболее вероятно, использование пользователем спецификатора преобразования %d), входные данные в буфере остаются непрочитанными и могут быть прочитаны следующимпозвоните по номеру scanf().

Таким образом, в случае вызова scanf() всегда рекомендуется проверять сбой и очищать буфер, используя getchar(), который читает символьный символ stdin и возвращает символ, читаемый какunsigned char приведение к int в каждом вызове, что потребляет любую запись в буфере и очищает ее.

0 голосов
/ 30 января 2019

Я немного погуглил, и из того, что я могу сказать, getchar () использует stdin, и это буфер, который очищается этой командой.Это также означает, что в этом случае «scanf» также использует «stdin».Это предположение верно?

Да, это правильно.

Согласно документации (выделено мной):

[scnaf] Считывает данные из стандартного ввода и сохраняет их в соответствии с форматом параметров в местах, указанных дополнительными аргументами.

...