【问题标题】: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 变量。

有人可以解释一下吗?

【问题讨论】:

标签: c char scanf format-specifiers


【解决方案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 键而存储的。

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2012-01-05
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2011-09-28
      • 2011-05-09
      相关资源
      最近更新 更多