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

Joe*_*oel 29 c scanf char format-specifiers

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

int word_count;
scanf("%d%*c", &word_count);
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是%*d引用char指针或word_count不接受char变量.

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

Bey*_*ios 23

*"%*c"代表assignment-suppressing character *:如果这个选项,该函数不分配转化为任何接收参数的结果.1因此,字符将被读取但不会分配给任何变量.


脚注:

1. fscanf


Vik*_*mkó 22

*c表示将读取一个字符但不会被分配,例如输入"30a"它将分配30 word_count,但"a"将被忽略.


Sou*_*osh 12

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

[...]每个转换规范都由角色引入%.在%之后,以下顺序出现:

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

并且关于行为,

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

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

那么,在这种情况下,

scanf("%d%*c", &word_count);
Run Code Online (Sandbox Code Playgroud)

是一个完全有效的声明.

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