scanf 格式说明符中的星号是啥意思? [复制]

Posted

技术标签:

【中文标题】scanf 格式说明符中的星号是啥意思? [复制]【英文标题】:What does an asterisk in a scanf format specifier mean? [duplicate]scanf 格式说明符中的星号是什么意思? [复制] 【发布时间】:2016-04-24 18:46:18 【问题描述】:

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

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

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

有人可以解释一下吗?

【问题讨论】:

见:The difference between %*c%c and %c fscanf documentation. 【参考方案1】:

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

【讨论】:

@PeterA.Schneider 是的,谢谢【参考方案2】:

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


脚注:

1。 fscanf

【讨论】:

【参考方案3】:

引用C11 标准,第 7.21.6.2 章,fscanf()

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

——一个可选的赋值抑制字符*。 — [...] — 转换说明符字符

关于行为,

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

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

所以,在这种情况下,

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

是一个完全有效的陈述。

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

【讨论】:

以上是关于scanf 格式说明符中的星号是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

星号 * 在 Python 中是啥意思? [复制]

“[*]”(星号修饰符)在 C 中是啥意思? [复制]

XAML ColumnDefinition 中的 *(星号)是啥意思?

%[^\n] 在 scanf() 格式字符串中是啥意思

红宝石:“p *1..10”中的星号是啥意思

`reveal_type` 输出中的星号是啥意思?