文章目录
一:前言
最近突然多出来了C语言实践课,老师补充了很多新的知识,学到了很多✈️✈️,特别喜欢我的C语言老师(米老师),就算我说了名字,宝子💕💕你也不认识。有一说一,假如让我一直跟着米老师上课,我保证不会偷懒,而且还可能会跟💞宝儿们💞分享更多的神奇知识。
🚀🚀看见米老师就不自觉打开C Primer Plus ,打开 DEV ,开始写代码…🐾🐾
💝💝宝儿~废话不多说,直接开卷🚗🚗
二:函数头文件
#include<stdio.h>
三:函数原型
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 的支持上。
💗💗臭宝儿,咱还是直接上例子吧,概念太抽象了,不易理解。
(一)初级用法
1.纯数字转换(int)
#include<stdio.h>
int main()
{
char str[100];
int a,b,c;
int num;
printf("请输入值:");
gets(str);
num=sscanf(str,"%1d%2d%3d",&a,&b,&c);
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
printf("返回值为:%d",num);
return 0;
}
2.纯数字转换(double)
#include<stdio.h>
int main()
{
char str[100];
double a,b,c;
int num;
printf("请输入值:");
gets(str);
num=sscanf(str,"%lf%lf%lf",&a,&b,&c);
printf("a=%lf\nb=%lf\nc=%lf\n",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(这个也是有空格的)
(二)高级用法
1.取指定长度的字符串
sscanf("LuckyMrLi2877 ", "%5s", str); //取指定长度的字符串
printf("str=%s\n", str);
输出结果: str=Lucky
sscanf("LuckyMrLi2877 ", "%11s", str); //取指定长度的字符串
printf("str=%s\n", str);
输出结果:str=LuckyMrLi28
2.取到指定字符为止
运算符%[ ]:说实话我也不知道什么意思,记住就完了👻👻
🚀🚀 遇到空格为止
sscanf("LuckyMrLi2877 Duang", "%[^ ]", str); //取遇到空格为止字符串
printf("str=%s\n", str);
输出结果:str=LuckyMrLi2877
🚀🚀遇到字符r为止
sscanf("LuckyMrLi2877 Duang", "%[^r]", str); //取遇到字符r为止字符串
printf("str=%s\n", str);
输出结果:str=LuckyM
🚀🚀取仅包含指定字符集
sscanf("654321abcdedfABCDEF", "%[1-9a-z]", str); //只取数字和小写字符
printf("str=%s\n", str);
输出结果:str=654321abcded
[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符 。
🚀🚀取到指定字符集为止
sscanf("BCDEF123456abcdedf", "%[^a-z]", str); //取遇到小写字母为止的字符串
printf("str=%s\n", str);
输出结果:str=BCDEF123456
(三)关于 * 的使用
🚀🚀符号 * 可用于格式中, (即 %*d 和 %s) 加了星号 () 表示跳过此数据不读入. (也就是不把此数据读入参数中)🐒🐒
sscanf("LuckyMrLi2877 Duang", "%*[^ ]%s", str); //忽略空格之前的字符串
printf("str=%s\n", str);
输出结果:str=Duang
💝💝%*d、%*s等相关的例子就让宝子自己动手操作吧啊。
(四)高高级用法
🚀🚀问题1:给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串
(获取 / 和 @ 之间的字符串,不就是忽略掉 “iios/” 然后读取到 “@”结束吗,简简单单,啊哈哈哈)
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", str); // "%*[^/]/%[^@]" 注意“/”的存在
printf("str=%s\n", str);
输出结果:str=12DDWDFF
注意“\”的存在,目的是为了和字符串"iios/12DDWDFF@122"中的“\”相互“抵消”。
这个例子可能有些稍微难理解,没关系,等💩💩臭宝儿💓💓学会了这个,那就说明宝儿真的理解了sscanf()函数了。💌💌🎉🎉
🚀🚀问题2:给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
(不就是忽略空格之前的字符,然后读后面的字符吗,简单。确实,方法确实可行,不妨动手试试。但是!我偏偏不按照这个思路写,诶~就是玩儿~)
sscanf(“hello, world”, "%*s%s", str);
printf("str=%s\n", str);
输出结果:str=world
🚀🚀%*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了。
试着想一下,如果逗号之后没有空格呢,那不就吧一整个全给过滤掉了吗,所以…
✈️✈️如果没有空格则结果为NULL。(整个字符串全部被过滤掉,结果当然是NULL)✈️✈️
五:财大OJ例题
*🚀题目描述🚀
每到月末,Lucky同学就会对这个月的支出账单进行整理和统计。如今电脑已经普及大学校园,所以Lucky同学想让电脑帮忙做这件事情。聪明的你就为Lucky同学编一个程序来完成这件事情吧。
输入:
多实例测试。首先输入一个整数ncase,表示测试实例的个数。每个测试实例的输入如下:
第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。❗️❗️中间会有一个或多个空格❗️❗️(真贱),而每一行的开头和结尾没有空格(我谢谢你)。 0.0 < c < 1000.0。
输出
每个测试实例对应一行输出,输出总的花费,小数点后保留一位数字。*
思路分析:
先吐槽一波。
❗️❗️中间会有一个或多个空格❗️❗️(可真贱),而每一行的开头和结尾没有空格(那我谢谢你)
当我没有接触到 sscanf() 函数的时候我的思路是利用 strrchr() 函数查找到最右侧的一个空格,那么空格再往右侧就是花费的钱数了啊。真美~ 😑😑
但是,查找到钱数之后,需要把字符串储存的小数或者整数转换成对应的十进制数字,说实话,这确实挺麻烦的。
唉…既然说都说到这了,我就把思路全讲了吧,毕竟是要全心全意为臭宝儿服务的💕💕
接着我是利用 strlen() 函数来得到整个数字的长度(位数),然后利用 strchr()函数来查找到小数点的位置,继续利用 strlen() 函数来得到小数点之后的数字的位数,再通过利用ASII码表和<math.h>中的函数…一系列的嘎嘎转换👊👊👊最终得到十进制数字。
真的是嘎嘎麻烦🐋🐋🐋,可能臭宝儿有更好的思路,毕竟臭宝儿那么聪明,是吧~💕💕💕
🚀🚀🚀(我猜宝子会用 sscanf() 函数,宝儿~会直接过滤掉数字之前的字符串,然后按照%lf的格式读取剩余的数字,嘎嘎聪明👍👍👍)
废话不多说,直接上代码:
不知道sscanf()函数之前的代码:
(说实话,我这段代码写的还是挺漂亮的,我这小指针用的,一顿乱指🙉🙉🐥🐥🐥)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
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<num1;i++)
{
number+=((*(pr+i))-'0')*(pow(10.0,j--));
}
for(pt+=1,i=0,j=1;i<num2;i++)
{
number+=((*(pt+i))-'0')*(pow(0.1,j++));
}
}
else
{
for(i=0,j=sum-1;i<sum;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<i;j++)
{
char str[101];
gets(str);
double number=search(str);
numbers+=number;
}
printf("%.1lf\n",numbers);
n--;
}
return 0;
}
简单学习了sscanf()函数后的代码:
#include<stdio.h>
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<i;j++)
{
char str[101];
gets(str);
sscanf(str,"%*[^0-9]%lf",&number); //臭宝儿~记得多瞅两眼
numbers+=number;
}
printf("%.1lf\n",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
🚀🚀🚀文章内容可能会有错误,希望宝子们能够留言指出💕💕💕
🚀🚀🚀一起加油吧!✊✊✊
(今天郑州下雨了,降温了,做核酸的时候真的超级冷,我穿了卫衣 套了个睡衣,哈哈哈)
#include<stdio.h>
int main()
{
while(1)
{
printf("郑州,加油!!!");
}
return 0;
}
2022、05、09 || 21:57