Смущает поведение getchar() и fflush (stdin)

63
8

Я думал, что getchar() или fflush(stdin) использовались для переноса новой строки или пробела, оставшегося на предыдущем входе, потому что функция gets() не может различать эту новую строку и ввод, который мы предоставляем. Нам не нужны те, когда мы используем %s для функции scanf. Зачем нам это нужно, когда мы используем %c или %d для одной и той же функции?

спросил(а) 2021-01-25T20:12:17+03:00 4 месяца, 4 недели назад
1
Решение
63

Дело в том, что fflush() не имеет определенного поведения для входных потоков, существуют определенные конкретные реализации, определенные реализацией. Кроме того, в glibc есть fpurge() который делает то, что вы хотите.

При использовании scanf() правило заключается в том, что оно остановится, когда оно найдет символ пробела, возвращенный isspace(), за исключением случаев, когда используется %c который ведет себя по-другому, поскольку он может захватывать белые пробелы или игнорировать их все, если предшествует белый пространство.

Кроме того, функция gets() является опасной и недавно удалена из стандарта c, поэтому вы не должны использовать ее или ссылаться на нее в качестве примера.

Функция fgets(), которая является лучшей версией gets(), фиксирует окончательный '\n' если это возможно, то есть, если количество символов, захваченных до сих пор, не превышает значение второго параметра, поэтому вы не нужно смыть что-нибудь после него.

Вы должны учитывать, что scanf() не только оставляет последний '\n' во входном буфере, но и любое пробел, следующий за ним. Таким образом, одного getchar() обычно недостаточно, вы должны getchar() столько же пробелов, сколько осталось, чтобы обеспечить видимое поведение fflush(stdin).

ответил(а) 2021-01-25T20:12:17+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема