Почему ошибки scanf не позволяют ему использовать входной буфер?

#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.