关于sscanf的应用

看到很多人把百度百科一抄,就是记录了。查个资料头疼。
所以在这里根据自己的理解把关于sscanf的基本应用记录一下:

此处先不说sscanf的通用样式。
1、sscanf(“12345”,"%s",buf);
printf("%s\n",buf);
这里是将12345给buf,所以这里的输出是12345;这是sscanf的一般用法。

2、在%s中间加上数字,比如说%2s,这个意思就是将12345中的前两位赋值给buf,
举例:sscanf(“123456”,"%s",buf);
printf("%s\n",buf);
这里的buf输出就会使12.

3、将%s换成“%[^“这里是一个标识符“]” 比如说是%[^ ],注意这里有一个空格。
这里的意思就是遇到空格为止,将前面的字符串给buf;
举例:sscanf(“123456 sadasdsa”,”%s",buf);
printf("%s\n",buf);
这里的buf输出就会使123456.如果没有空格就是全部。
注:这里还可以用%[^A-Z],这个意思就是遇到A到Z的字母就停止,也就是遇到大写字母就停止的意思。

4、%[这里是范围],比如说%[a-z]这个意思是a到z的字符提取出来,给buf;也就是提取所有的小写字母。
举例;sscanf(“123456sadasdsaSDFGH”,"%[a-z]",buf);
printf("%s\n",buf);
这里的buf输出会是sadasdsa。
注:%[]方括号里面的类型不局限一种,比如说%[a-z1-9]这个的意思就是a到z和1到9的都提取出来。也就是小写字母和数字。

5、%[^/]/% [^@]这个的意思就是获取从/到@之间的字符串。其中 [^/] 的意思是取到/为止,但是在sscanf的作用是忽略的意思,所以就是忽略/号之前的,直到@为止的内容被提取。
举例:字符串sadfadsf/adsfasd@12312,这里提取出来的就是adsfasd。

6、%*s%s,这个意思就是过滤第一个,保留后一个的意思。
举例:sscanf(“hello, world”, “%*s%s”, buf);
注意这里逗号之后一定要有空格。没有空格,整个字符串会被匹配给第一个%s给过滤掉。
在这个里面%*s对应的是hello, %s对应的是world,这个意思就是过滤掉hello,,留下world。

7、按照指定格式来取
sscanf(“2015.04.05”, “%d.%d.%d”, &a,&b,&c);
这里的%d.%d.%d会按照点号,提取对应的数据赋值。
在这里a就是2015,b就是04,c就是05.

除了以上功能,sscanf还可以和%n配合作为参数校验。scanf也可以。这里讲的sscanf,就用sscanf来写。

实践:把字符串中的数字提取出来。
(示例:a12b2提取出来的数字会是12和2.)
char a[] = “a1k34jkf;4567akl1012kl”;
int i, k, x;
for (i = 0; a[i]; i++){
if (sscanf(a + i, “%d%n”, &k, &x)){
printf("%d “, k);
i += x;
}
}
printf(”\n");
之所以可以进行参数校验,这里就要说一下%n,%n的作用,它是输入格式化控制字符,意思是把接受的数据的字符个数赋给对应的变量。
scanf("%s%n",a,&t);这里就把接收的字符个数赋给t。
这里a+i可以理解成&a[i],因为*(a+i)是和a[i]等效。所以&*(a+i)=a+i=&a[i]。这里是为了适配sscanf本身要求的格式。
因为是判断,所以如果不是%d格式的也就是说不是数字的,全部都会被过滤掉,而是数字的,被记录。所以可以完成筛选,把数字提取出来。而x就实现了,将相邻的数字组合在一起之后,可以跳过数字组合,到达下一个字母区域。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值