甜甜C语言——sscanf()函数

一:前言

最近突然多出来了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;
}

💗💗宝儿~这个我就不帮你运行程序了,这个真的很有意思的,你不信的话可以试试🙉🙉,我随便给你几组测试数据吧,相信宝子通过自己的实践会懂得原理的。☀️☀️一定要动手上机试试哦💗💗

测试:

  1. 🚀🚀12.362356 (下面三个都没有空格存在哦)
  2. 🚀🚀12.36.2356
  3. 🚀🚀12.36.23.56
  4. 🚀🚀12.3 6.2 3.56 (有空格哦)
  5. 🚀🚀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

  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Duang~Lucky.Mr.Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值