Да, это так.Это явно упоминается в документации.
Цитирование стандарта 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
в каждом вызове, что потребляет любую запись в буфере и очищает ее.