Ответ 1
*c
означает, что a char будет считаться, но не будет назначен, например, для ввода "30a" он назначит 30 на word_count
, но "a" будет проигнорирован.
Итак, я наткнулся на этот код, и я не смог понять, в чем его цель или как он работает:
int word_count;
scanf("%d%*c", &word_count);
Моя первая мысль заключалась в том, что %*d
ссылался на указатель char
или отклонял word_count
от принятия переменных char
.
Может кто-то пролить свет на это?
*c
означает, что a char будет считаться, но не будет назначен, например, для ввода "30a" он назначит 30 на word_count
, но "a" будет проигнорирован.
*
в "%*c"
означает assignment-suppressing character *
: если этот параметр присутствует, функция не присваивает результат преобразования любому принимающему аргументу. 1 Таким образом, символ будет читать, но не назначать какой-либо переменной.
<суб > Сноска:суб >
<суб > 1. fscanf
Чтобы процитировать стандарт C11
, раздел §7.21.6.2, fscanf()
[...] Каждая спецификация преобразования вводится символом
%
. После% появляются следующие последовательности:- Дополнительный символ подавления присваивания
*
.
- [...]
- Символ спецификатора преобразования
и относительно поведения,
[..] Если подавление присваивания не было указано a
*
, результат преобразования помещается в объект, на который указывает первый аргумент, следующий аргумент формата, который еще не получил результат преобразования. [...]
Это означает, что в случае спецификатора формата, такого как "%*c"
, char
будет считываться из stdin
, но отсканированное значение не будет храниться или не привязываться к чему-либо. Таким образом, вам не нужно указывать соответствующий параметр.
Итак, в этом случае
scanf("%d%*c", &word_count);
является отлично действующим.
Например, то, что он делает в среде * nix, это очистить входной буфер от newline
, который сохраняется из-за нажатия клавиши ENTER после ввода.