【问题标题】: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
^^ ^^