我在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
以前看过,但从未看过字符串。
转换说明符的*
之后%
和之前是分配抑制标志。它指示匹配的条目将不会被存储(即将被丢弃),并且不需要相应的存储参数。
引用C11
第§7.21.6.2章
[...]除非用a指示分配抑制,否则
*
转换结果将放置在尚未接收转换结果的format参数后面的第一个参数指向的对象中。
就是说,对于输入
Name:Smith Group:7
您期望的是类似
%*s
匹配“名称:”并丢弃
%50s
匹配“史密斯”并存储
%*s
匹配“组:”并丢弃
%d
匹配7
并存储。
但是,有一个问题。对于转化说明符s
,
匹配一系列非空格字符
这意味着它将扫描并匹配直到一个空格,并且由于直到“ Group”之前都没有空格,所以整个“ Name:Smith”将被第一个%*s
指令占用。同样,以下内容%*s
也会发生。因此,转换规范不会结束,而是scanf()
等待下一个输入被消耗。
因此,为了匹配转换规范,请以
Name: Smith Group: 7 ^^ ^^