scanf 格式说明符中的星号是什么意思?
What does an asterisk in a scanf format specifier mean?
所以我偶然发现了这段代码,但一直无法弄清楚它的用途是什么,或者它是如何工作的:
int word_count;
scanf("%d%*c", &word_count);
我的第一个想法是 %*d
正在引用 char
指针或不允许 word_count
使用 char
变量。
有人可以解释一下吗?
"%*c"
中的*
代表assignment-suppressing character *
:如果存在该选项,函数不会将转换结果赋值给任何接收参数.1 所以字符将被读取但不会分配给任何变量。
脚注:
1. fscanf
引用 C11
标准,章节 §7.21.6.2,fscanf()
[...] Each conversion specification is introduced by the character %
.
After the %, the following appear in sequence:
— An optional assignment-suppressing character *
.
— [...]
— A conversion specifier character
关于行为,
[..] Unless assignment suppression was indicated by a *
, the
result of the conversion is placed in the object pointed to by the first argument following
the format argument that has not already received a conversion result. [...]
这意味着,对于像 "%*c"
这样的格式说明符,将从 stdin
中读取 char
,但扫描的值不会被存储或分配给任何东西.所以,你不需要提供相应的参数。
因此,在这种情况下,
scanf("%d%*c", &word_count);
是一个完全有效的语句。
例如,它在 *nix 环境中所做的是从 newline
中清除由于输入后按 ENTER 键而存储的输入缓冲区.
*c
意味着,一个字符将被读取但不会被分配,例如对于输入“30a”,它会将 30 分配给 word_count
,但是 'a'将被忽略。
所以我偶然发现了这段代码,但一直无法弄清楚它的用途是什么,或者它是如何工作的:
int word_count;
scanf("%d%*c", &word_count);
我的第一个想法是 %*d
正在引用 char
指针或不允许 word_count
使用 char
变量。
有人可以解释一下吗?
"%*c"
中的*
代表assignment-suppressing character *
:如果存在该选项,函数不会将转换结果赋值给任何接收参数.1 所以字符将被读取但不会分配给任何变量。
脚注:
1. fscanf
引用 C11
标准,章节 §7.21.6.2,fscanf()
[...] Each conversion specification is introduced by the character
%
. After the %, the following appear in sequence:— An optional assignment-suppressing character
*
.
— [...]
— A conversion specifier character
关于行为,
[..] Unless assignment suppression was indicated by a
*
, the result of the conversion is placed in the object pointed to by the first argument following the format argument that has not already received a conversion result. [...]
这意味着,对于像 "%*c"
这样的格式说明符,将从 stdin
中读取 char
,但扫描的值不会被存储或分配给任何东西.所以,你不需要提供相应的参数。
因此,在这种情况下,
scanf("%d%*c", &word_count);
是一个完全有效的语句。
例如,它在 *nix 环境中所做的是从 newline
中清除由于输入后按 ENTER 键而存储的输入缓冲区.
*c
意味着,一个字符将被读取但不会被分配,例如对于输入“30a”,它会将 30 分配给 word_count
,但是 'a'将被忽略。