当前位置:  开发笔记 > 编程语言 > 正文

字符串格式(C%* s)

如何解决《字符串格式(C%*s)》经验,为你挑选了1个好方法。

我在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以前看过,但从未看过字符串。



1> Sourav Ghosh..:

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

引用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
     ^^           ^^

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有