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

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

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

我的第一个想法是%*d引用了char指针或禁止word_count取得char变量。

有人可以对此有所了解吗?

*c表示将读取char但不会被分配,例如对于输入“30a”,它将为word_count分配30,但是’a’将被忽略。

"%*c"表示assignment-suppressing character *如果存在此选项,则该函数不会将转换结果分配给任何接收参数。 1因此,字符将被读取但不会分配给任何变量。


脚注:

1. fscanf

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

[…]每个转换规范由字符%引入。 在%之后,以下顺序出现:

– 可选的赋值抑制字符*
– […]
转换说明符字符

并且关于行为,

[..]除非通过*指示赋值抑制,否则转换的结果将放在由尚未收到转换结果的format参数后面的第一个参数指向的对象中。 […]

这意味着,在格式说明符如"%*c" ,将从stdin读取char ,但扫描的值不会被存储或分配给任何内容。 因此,您无需提供相应的参数。

那么,在这种情况下,

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

是一个完全有效的声明。

例如,它在* nix环境中的作用是清除输入缓冲区,该输入缓冲区由于在输入后按ENTER键而存储。