C语言字符串的组包解包

sprintf组包

在这里插入图片描述
案例:千锋教育

int sprintf(buf,"格式",数据)
//buf:用来存放组好的报文
//"格式":按照格式组包
//数据:各个零散的数据
返回值:返回值的是组好的报文的实际长度(不包含'\0'void test06()
{
	int year = 2020;
	int mon = 2;
	int day = 24;
	int len = 0;

	//需求:将2020 2  24组成一个"2020年2月24日"
	char buf[128]="";
	
	//%d 和 year 类型要一一对应
	len = sprintf(buf,"%d年%d月%d日", year,mon,day);
	printf("len = %d\n", len);
	printf("buf=%s\n",buf);
}

在这里插入图片描述

sscanf解包

在这里插入图片描述
sscanf的基本语法

void test09()
{
	char buf[]="2020年2月24日";
	int year=0;
	int mon=0;
	int day=0;
	char ch = 0;
	char str_year[32]="";
	char str_mon[32]="";
	char str_day[32]="";


	//%d 只能提取'0'~'9'
	sscanf(buf,"%d年%d月%d日", &year,&mon,&day );
	printf("year = %d\n",year);//2020
	printf("mon = %d\n",mon);//2
	printf("day = %d\n",day);//24

	//%c 提取一个字符   %f 提取提取浮点数
	sscanf(buf,"%c", &ch);
	printf("##%c##\n",ch);//'2'

	//%s 提取一个字符串 遇到空格、回车、'\0' 停止获取
	//buf==>"2020年2月24日"
	sscanf(buf,"%s年%s月%s日",str_year, str_mon,str_day );
	printf("str_year=%s\n",str_year);//"2020年2月24日"
	printf("str_mon=%s\n",str_mon);//null
	printf("str_day=%s\n",str_day);//null
}

运行结果:
在这里插入图片描述

sscanf的高级用法1:使用%*s %*d 跳过提取的内容(不要提取的内容)

sscanf("1234 5678","%*s %d",&data1);//5678

sscanf的高级用法2:使用%[n]s %[n]d 提取指定宽度n的字符串或数据

sscanf("12345678","%*2s%2d%*2d%s" ,&data2, buf);//data2=34  buf="78";

sscanf的高级用法3:使用%[a-z] 提取a-z的字符串

//%[]都是 按 字符串 提取
char buf[128]="";
sscanf("abcDefABC","%[a-z]",buf);//遇到不是a-z的字符就跳出提取
printf("buf=%s\n", buf);//"abc"

sscanf的高级用法4:使用%[aBc] 提取 a B c

sscanf("aaBBcEdaBcef","%[aBc]",buf);//只提取a B c遇到其他字符也会跳出提取
printf("buf=%s\n", buf);//aaBBc

sscanf的高级用法5:使用% [ ^abc] 只要不是a b c任何一个 都要

sscanf("ABCcABC","%[^abc]",buf);//遇到a b c就会跳出提取
printf("buf=%s\n", buf);//ABC
发布了3 篇原创文章 · 获赞 5 · 访问量 255

猜你喜欢

转载自blog.csdn.net/weixin_43288201/article/details/104526512
今日推荐