在scanf格式说明符中,星号的含义是什么?

31

我偶然发现了这段代码,但我一直无法弄清它的目的或者它是如何工作的:

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

我最初的想法是%*d是在引用一个char指针或禁止word_count接受char变量。

有人能解释一下吗?


3个回答

33

*c表示将读取一个字符但不会被赋值,例如对于输入"30a",它会将30分配给word_count,但忽略'a'。


1
@PeterA.Schneider 确实,谢谢。 - Viktor Simkó

24

"%*c"中的*表示屏蔽赋值字符 * :如果此选项存在,则函数不会将转换结果分配给任何接收参数。因此,该字符将被读取但不会分配给任何变量。1


脚注:

1. fscanf


15
引用《C11》标准,章节§7.21.6.2中的话:fscanf()

每个转换说明符都由字符%引入。在%之后,按照以下顺序出现:

— 可选的禁止赋值字符*
— [...]
— 转换说明符字符

关于行为方面,

[...] 除非使用*指示了禁止赋值,否则转换的结果将被放置在已经接收到转换结果的格式参数后的第一个参数所指向的对象中。[...]

这意味着,在格式说明符"%*c"的情况下,将从stdin读取一个char,但扫描到的值不会被存储或分配给任何东西。因此,您不需要提供相应的参数。

因此,在这种情况下,

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

这是一个完全有效的陈述。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接