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

时间:2016-01-19 10:28:12

标签: c char scanf format-specifiers

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

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

我首先想到的是%*d引用char指针或禁止word_countchar个变量。

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

3 个答案:

答案 0 :(得分:23)

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

<子>的脚注:

<子> 1。 fscanf

答案 1 :(得分:21)

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

答案 2 :(得分:12)

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

  

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

     

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

并且关于行为,

  

[..]除非*表示分配抑制,否则   转换结果放在下面第一个参数指向的对象中   尚未收到转换结果的format参数。 [...]

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

所以,在这种情况下,

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

完全有效的语句。

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