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键而存储。