Разве набор сканирования [^ \ n] не предписывает scanf () делать то же самое, что и без scanset, потому что scanf () по умолчанию пропускает символы пробела? - PullRequest
0 голосов
/ 25 октября 2019

Я читал о поведении наборов сканеров. Изучая и тестируя, я столкнулся с проблемой.

Не scanf() с набором сканирования [^\n] ведет себя так же, как если бы не было этого набора сканирования?

scanf() потребляет символы до тех пор, пока символ пробела, такой как символ \n, не будет найден в stdin. Таким образом, результат должен быть точно таким же, независимо от того, включил ли я отрицаемый набор сканирования [\ n] или нет.


Например:

char str[100];
scanf("%99[^\n]s", str);

По сравнению с:

char str[100];
scanf("%99s",str);

ПРИМЕЧАНИЕ : Это всего лишь пример того, что я хочу спросить. Пожалуйста, не отклоняйтесь только от самого вопроса, если есть проблема с этим выражением.


Итак, мои вопросы:

  1. Это не поведението же самое, потому что scanf() пропускает пропущенные символы пробела, такие как символ новой строки по умолчанию?

  2. Почему я должен реализовывать набор сканирования [^\n] внутри одного scanf() выражениякогда это уже так обрабатывается по умолчанию?

Большое спасибо.

1 Ответ

3 голосов
/ 25 октября 2019

Похоже, вы ошибочно полагаете, что scanset - это своего рода модификатор %s, о чем свидетельствует ваш пример:

scanf("%[^\n]s", str);

Это строка формата scanf, которая всегда не будет соответствоватьлитерал 's' в конце.

Скорее, %[ - это совершенно другой спецификатор преобразования из %s. %s потребляет и игнорирует все начальные пробелы перед запуском, затем останавливается на пробеле. %[ вообще не игнорирует начальные пробелы и останавливается только на несовпадающем символе - специально не обрабатывает пробелы.

...