#c #scanf
#c #scanf
Вопрос:
Как мы знаем, если мы попытаемся прочитать значение, тип которого не представляет параметр формата (например. %d
со значением z
, …), scanf
не будет очищать входной буфер после ошибки чтения (и обычно это может вызвать бесконечный цикл), но, будучи функцией библиотеки (поэтому напрямую не связанной с операциями ядра), не следует использовать атомарный системный вызов, подобный read
функции? Если да, то почему вывод не очищается, в то время как с помощью a read
он есть?
Также, когда мы что-то читаем scanf
во входном буфере, оно всегда будет оставаться 'n'
символом (новой строки). Откуда он знает, что это может не использовать его?
Комментарии:
1. 1)
scanf()
не предназначен для чтения строк . Если код хочет прочитать строки пользовательского ввода, используйтеfgets()
. 2) «прочитайте что-нибудь с помощью scanf во входном буфере, оно всегда будет оставаться ‘ n'» -> не всегда.2. 1) Ну, я все еще не понимаю, почему он так себя ведет, а также я задаю вопрос не о конкретном случае (как вы сказали со строками), а в целом. 2) Можете ли вы лучше объяснить, почему не всегда ? Когда scanf использует символ ‘ n’? Пожалуйста, будьте более понятны
3.
char ch; scanf("%c", amp;ch);
использует следующий символ ввода и сохраняет егоch
, даже если это a'n'
.4. Возможно, упростить и сузить ваши 4 вопроса.
5.
scanf will not clear the input buffer after the reading's error
Несоответствие спецификатору формата не является » ошибкой чтения «, поэтому scanf нечего » очищать «. Код, вызывающий scanf, должен решить, следует ли снова читать в другом формате, или игнорировать строку, или, возможно, сделать что-то совершенно другое.in the input buffer it will always remain 'n'
Нет, не так. Это зависит от строки формата, которую вы передаете в scanf.