- 前言
- 函数头文件
- 函数原型
- 函数功能实现
- 初级用法
- 纯数字转换(int)
- 纯数字转换(double)
- 高级用法
- 取指定长度的字符串
- 取到指定字符为止
- 关于 * 的使用
- 高高级用法
- 财大OJ例题
- 结语
最近突然多出来了C语言实践课,老师补充了很多新的知识,学到了很多✈️✈️,特别喜欢我的C语言老师(米老师),就算我说了名字,宝子你也不认识。有一说一,假如让我一直跟着米老师上课,我保证不会偷懒,而且还可能会跟宝儿们分享更多的神奇知识。
看见米老师就不自觉打开C Primer Plus ,打开 DEV ,开始写代码…
宝儿~废话不多说,直接开卷
函数原型#include
int sscanf(
const char *str,
const char *format ,
pt…
);
str:待解析的字符串;
format:字符串格式描述;
返回值:成功转换的个数(类比scanf()函数的返回值)
例如:sscanf(str,“%d%d%s”, &x,&y, &s); 如果三个格式都读入成功会返回3。如果只读入了第一个整数到 x 则会返回1。证明无法从 str 读入第二个整数。
功能体现:将传入的参数 str 字符串,按照 format 的格式进行转化并将结果传递给 pt
宝儿~,这个看起来比较枯燥,的确,下面直接给宝儿举例子。
sscanf("ChouBaoEr3456 ", “%9s”, pt);
把字符串"ChouBaoEr3456 “按照 “%4s” 的格式进行转换,并将结果传递给 pt .
那么 printf(”%s",pt); 输出的结果就是: ChouBaoEr
该例子的返回值是 1 (成功转化了一个格式)
看了这个例子,宝儿是不是稍微明白一点了呢?
函数功能实现它强大的功能就是体现在对 format 的支持上。
臭宝儿,咱还是直接上例子吧,概念太抽象了,不易理解。
#include纯数字转换(double)int main() { char str[100]; int a,b,c; int num; gets(str); num=sscanf(str,"%1d%2d%3d",&a,&b,&c); printf("a=%dnb=%dnc=%dn",a,b,c); printf("返回值为:%d",num); return 0; }
#includeint main() { char str[100]; double a,b,c; int num; printf("请输入值:"); gets(str); num=sscanf(str,"%lf%lf%lf",&a,&b,&c); printf("a=%lfnb=%lfnc=%lfn",a,b,c); printf("返回值为:%d",num); return 0; }
宝儿~这个我就不帮你运行程序了,这个真的很有意思的,你不信的话可以试试,我随便给你几组测试数据吧,相信宝子通过自己的实践会懂得原理的。☀️☀️一定要动手上机试试哦
测试:
- 12.362356 (下面三个都没有空格存在哦)
- 12.36.2356
- 12.36.23.56
- 12.3 6.2 3.56 (有空格哦)
- 12.3 6.2 3.56 8.89(这个也是有空格的)
sscanf("LuckyMrLi2877 ", "%5s", str); //取指定长度的字符串
printf("str=%sn", str);
输出结果: str=Lucky
sscanf("LuckyMrLi2877 ", "%11s", str); //取指定长度的字符串
printf("str=%sn", str);
输出结果:str=LuckyMrLi28
取到指定字符为止运算符%[ ]:说实话我也不知道什么意思,记住就完了
遇到空格为止
sscanf("LuckyMrLi2877 Duang", "%[^ ]", str); //取遇到空格为止字符串
printf("str=%sn", str);
输出结果:str=LuckyMrLi2877
遇到字符r为止
sscanf("LuckyMrLi2877 Duang", "%[^r]", str); //取遇到字符r为止字符串
printf("str=%sn", str);
输出结果:str=LuckyM
取仅包含指定字符集
sscanf("654321abcdedfABCDEF", "%[1-9a-z]", str); //只取数字和小写字符
printf("str=%sn", str);
输出结果:str=654321abcded
[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。
取到指定字符集为止
sscanf("BCDEF123456abcdedf", "%[^a-z]", str); //取遇到小写字母为止的字符串
printf("str=%sn", str);
输出结果:str=BCDEF123456
关于 * 的使用符号 * 可用于格式中, (即 %*d 和 %s) 加了星号 () 表示跳过此数据不读入. (也就是不把此数据读入参数中)
sscanf("LuckyMrLi2877 Duang", "%*[^ ]%s", str); //忽略空格之前的字符串
printf("str=%sn", str);
输出结果:str=Duang
%*d、%*s等相关的例子就让宝子自己动手操作吧啊。
高高级用法问题1:给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串
(获取 / 和 @ 之间的字符串,不就是忽略掉 “iios/” 然后读取到 “@”结束吗,简简单单,啊哈哈哈)
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", str); // "%*[^/]/%[^@]" 注意“/”的存在
printf("str=%sn", str);
输出结果:str=12DDWDFF
这个例子可能有些稍微难理解,没关系,等臭宝儿学会了这个,那就说明宝儿真的理解了sscanf()函数了。
问题2:给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
(不就是忽略空格之前的字符,然后读后面的字符吗,简单。确实,方法确实可行,不妨动手试试。但是!我偏偏不按照这个思路写,诶~就是玩儿~)
sscanf(“hello, world”, "%*s%s", str);
printf("str=%sn", str);
输出结果:str=world
%*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了。试着想一下,如果逗号之后没有空格呢,那不就吧一整个全给过滤掉了吗,所以…
✈️✈️如果没有空格则结果为NULL。✈️✈️
财大OJ例题题目描述
每到月末,Lucky.Mr.Li(简单操作一波儿)就会对这个月的支出账单进行整理和统计。如今电脑已经普及大学校园,所以小明想让电脑帮忙做这件事情。聪明的你就为小明编一个程序来完成这件事情吧。
输入
多实例测试。首先输入一个整数ncase,表示测试实例的个数。每个测试实例的输入如下:
第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。❗️❗️中间会有一个或多个空格❗️❗️(真贱),而每一行的开头和结尾没有空格(我谢谢你)。 0.0 < c < 1000.0。
输出
每个测试实例对应一行输出,输出总的花费,小数点后保留一位数字。
当我没有接触到 sscanf() 函数的时候我的思路是利用 strrchr() 函数查找到最右侧的一个空格,那么空格再往右侧就是花费的钱数了啊。真美~
但是,查找到钱数之后,需要把字符串储存的小数或者整数转换成对应的十进制数字,说实话,这确实挺麻烦的。唉…既然说都说到这了,我就把思路全讲了吧,毕竟是要全心全意为臭宝儿服务的
接着我是利用 strlen() 函数来得到整个数字的长度(位数),然后利用 strchr()函数来查找到小数点的位置,继续利用 strlen() 函数来得到小数点之后的数字的位数,再通过一系列的嘎嘎转换…最终得到十进制数字。
真的是嘎嘎麻烦,可能臭宝儿有更好的思路,毕竟臭宝儿那么聪明,是吧~
(我猜宝子会用 sscanf() 函数,宝儿~会直接过滤掉数字之前的字符串,然后按照%lf的格式读取剩余的数字,嘎嘎聪明)
废话不多说,直接上代码:
不知道sscanf()函数之前的代码:
(说实话,我这段代码写的还是挺漂亮的,我这小指针用的,一顿乱指)
#include#include #include #include double search(char *str) { char *pr,*pt; double number=0; int i,j; pr=strrchr(str,' '); pr+=1; //printf("%c",pr[0]); int sum=strlen(pr); //printf("**%d**",sum); pt=strrchr(pr,'.'); //printf("**%c**",pt[1]); if(pt) { int num=strlen(pt); //printf("**%d**",num); int num1=sum-num; int num2=num-1; for(i=0,j=num1-1;i number+=((*(pr+i))-'0')*(pow(10.0,j--)); } for(pt+=1,i=0,j=1;i number+=((*(pt+i))-'0')*(pow(0.1,j++)); } } else { for(i=0,j=sum-1;i number+=((*(pr+i))-'0')*(pow(10.0,j--)); } } return number; } int main() { int n; scanf("%d",&n); while(n>0) { int i,j; double numbers=0; scanf("%d",&i); getchar(); //非常牛逼 (想了很久才解决的问题)(读掉上次输入缓冲区的'n') for(j=0;j char str[101]; gets(str); double number=search(str); numbers+=number; } printf("%.1lfn",numbers); n--; } return 0; }
简单学习了sscanf()函数后的代码:
#include结语int main() { int n; scanf("%d",&n); while(n>0) { int i,j; double numbers=0; double number; scanf("%d",&i); getchar(); //读掉上次输入缓冲区的'n' for(j=0;j char str[101]; gets(str); sscanf(str,"%*[^0-9]%lf",&number); //臭宝儿~记得多瞅两眼 numbers+=number; } printf("%.1lfn",numbers); n--; } return 0; }
以上内容就是我对sscanf()函数简单的整理,说实话,我就是刚刚才学的这个函数,文章内容参考了不少优质的博客。
参考来源:
https://blog.csdn.net/zhouwei1221q/article/details/44890617
https://blog.csdn.net/faihung/article/details/119325390
https://baike.baidu.com/item/sscanf%28%29/14691809?fr=aladdin
文章内容可能会有错误,希望宝子们能够留言指出
一起加油吧!✊✊✊
(今天郑州下雨了,降温了,做核酸的时候真的超级冷,我穿了卫衣 套了个睡衣,哈哈哈)
#includeint main() { while(1) { printf("郑州,加油!!!"); } return 0; }
2022、05、09 || 21:57



