栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 前言
  • 函数头文件
  • 函数原型
  • 函数功能实现
    • 初级用法
      • 纯数字转换(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 的支持上。
臭宝儿,咱还是直接上例子吧,概念太抽象了,不易理解。

初级用法 纯数字转换(int)
#include
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;
}

纯数字转换(double)
#include
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=%lfnb=%lfnc=%lfn",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(这个也是有空格的)
高级用法 取指定长度的字符串
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

文章内容可能会有错误,希望宝子们能够留言指出

一起加油吧!✊✊✊

(今天郑州下雨了,降温了,做核酸的时候真的超级冷,我穿了卫衣 套了个睡衣,哈哈哈)

#include
int main()
{
	while(1)
	{
		printf("郑州,加油!!!"); 
	}
	return 0; 
 } 
 

2022、05、09 || 21:57

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873193.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号