scanf 格式说明符中的星号是什么意思?

What does an asterisk in a scanf format specifier mean?

所以我偶然发现了这段代码,但一直无法弄清楚它的用途是什么,或者它是如何工作的:

int word_count;
scanf("%d%*c", &word_count);

我的第一个想法是 %*d 正在引用 char 指针或不允许 word_count 使用 char 变量。

有人可以解释一下吗?

"%*c"中的*代表assignment-suppressing character *如果存在该选项,函数不会将转换结果赋值给任何接收参数.1 所以字符将被读取但不会分配给任何变量。


脚注:

1. fscanf

引用 C11 标准,章节 §7.21.6.2,fscanf()

[...] Each conversion specification is introduced by the character %. After the %, the following appear in sequence:

— An optional assignment-suppressing character *.
— [...]
— A conversion specifier character

关于行为,

[..] Unless assignment suppression was indicated by a *, the result of the conversion is placed in the object pointed to by the first argument following the format argument that has not already received a conversion result. [...]

这意味着,对于像 "%*c" 这样的格式说明符,将从 stdin 中读取 char,但扫描的值不会被存储或分配给任何东西.所以,你不需要提供相应的参数。

因此,在这种情况下,

scanf("%d%*c", &word_count);

是一个完全有效的语句。

例如,它在 *nix 环境中所做的是从 newline 中清除由于输入后按 ENTER 键而存储的输入缓冲区.

*c 意味着,一个字符将被读取但不会被分配,例如对于输入“30a”,它会将 30 分配给 word_count,但是 'a'将被忽略。