Ade*_*a K 3 c string printf input conversion-specifier
我在C的某处看到了一部分代码
char name[51];
int group = 0;
scanf("%*s %50s %*s %d", name, &group);
printf("%s / %d\n", name, group);
Run Code Online (Sandbox Code Playgroud)
如果我们介绍
“名称:史密斯集团:7”
它等待着我们引入另一个价值。真奇怪。到底发生了什么,%*s %50s %*s意味着什么。我%*s以前看过,但从未看过字符串。
转换说明符的*之后%和之前是分配抑制标志。它指示匹配的条目将不会被存储(即将被丢弃),并且不需要相应的存储参数。
引用C11第§7.21.6.2章
[...]除非用a指示分配抑制,否则
*转换结果将放置在尚未接收转换结果的format参数后面的第一个参数指向的对象中。
就是说,对于输入
Name:Smith Group:7
Run Code Online (Sandbox Code Playgroud)
您期望的是类似
%*s 匹配“名称:”并丢弃 %50s 匹配“史密斯”并存储%*s 匹配“组:”并丢弃 %d匹配7并存储。但是,有一个问题。对于转化说明符s,
匹配一系列非空格字符
这意味着它将扫描并匹配直到一个空格,并且由于直到“ Group”之前都没有空格,所以整个“ Name:Smith”将被第一个%*s指令占用。同样,以下内容%*s也会发生。因此,转换规范不会结束,而是scanf()等待下一个输入被消耗。
因此,为了匹配转换规范,请以
Name: Smith Group: 7
^^ ^^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41 次 |
| 最近记录: |