【发布时间】:2016-04-24 18:46:18
【问题描述】:
所以我偶然发现了这段代码,但我无法弄清楚它的目的是什么,或者它是如何工作的:
int word_count;
scanf("%d%*c", &word_count);
我的第一个想法是 %*d 引用了 char 指针或禁止 word_count 获取 char 变量。
有人可以解释一下吗?
【问题讨论】:
标签: c char scanf format-specifiers
所以我偶然发现了这段代码,但我无法弄清楚它的目的是什么,或者它是如何工作的:
int word_count;
scanf("%d%*c", &word_count);
我的第一个想法是 %*d 引用了 char 指针或禁止 word_count 获取 char 变量。
有人可以解释一下吗?
【问题讨论】:
标签: c char scanf format-specifiers
*c 表示将读取一个字符但不会分配,例如对于输入“30a”,它将为word_count 分配 30,但会忽略 'a'。
【讨论】:
"%*c" 中的* 代表assignment-suppressing character *:如果存在此选项,则函数不会将转换结果分配给任何接收参数。1 所以字符将被读取但不会分配给任何变量。
脚注:
1。 fscanf
【讨论】:
引用C11 标准,第 7.21.6.2 章,fscanf()
[...] 每个转换规范都由字符
%引入。 在 % 之后,依次出现以下内容:——一个可选的赋值抑制字符
*。
— [...]
— 转换说明符字符
关于行为,
[..] 除非
*指示分配抑制,否则 转换的结果放在后面的第一个参数指向的对象中 尚未收到转换结果的格式参数。 [...]
这意味着,对于像"%*c" 这样的格式说明符,将从stdin 读取char,但扫描的值不会被存储或分配给任何东西。因此,您无需提供相应的参数。
所以,在这种情况下,
scanf("%d%*c", &word_count);
是一个完全有效的陈述。
例如,它在 *nix 环境中的作用是从 newline 中清除输入缓冲区,该缓冲区是由于在输入后按 ENTER 键而存储的。
【讨论】: