【问题标题】:String format in C %*sC %*s 中的字符串格式
【发布时间】:2020-03-10 12:12:25
【问题描述】:

我在某处看到了一段 C 代码

char name[51];
int group = 0;
scanf("%*s %50s %*s %d", name, &group);
printf("%s / %d\n", name, group);

如果我们介绍

“姓名:史密斯组:7”

它等待我们引入另一个值。真奇怪。到底发生了什么,%*s %50s %*s 是什么意思。我之前看到过%*s,但从未在读取字符串之前和之后放置。

【问题讨论】:

  • 是的,我想通了。谢谢!

标签: c string input printf conversion-specifier


【解决方案1】:

% 之后和转换说明符之前的* 是一个赋值抑制标志。它表示匹配的条目将不会被存储(即将被丢弃)并且不需要相应的存储参数。

引用C11,第 7.21.6.2 章

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

也就是说,对于输入

Name:Smith Group:7

你所期望的是类似的

  • %*s 匹配 "Name:" 并丢弃
  • %50s 匹配“Smith”并存储
  • %*s 匹配“组:”并丢弃
  • %d 匹配 7 和商店。

但是,有一个问题。对于转换说明符s

匹配一系列非空白字符

这意味着,它会扫描并匹配直到出现空格,并且由于在“Group”之前没有空格,因此整个“Name:Smith”将被第一个 %*s 指令消耗。以下%*s 也会发生同样的情况。因此,转换规范没有结束,scanf() 等待下一个输入被消费。

因此,要匹配转换规范,请将输入提供为

Name: Smith Group: 7
     ^^           ^^

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 2012-06-06
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2022-04-08
    • 1970-01-01
    相关资源
    最近更新 更多