C语言---sprintf组包、sscanf解包

目录

一、sprintf组包(了解)

(一)案例1:将2022 9 24这三个数据组成一个“2022年9月24日”

(二)案例2:将一个人的姓名、年龄、性别、家庭地址组成要求的格式

(三)案例3:将数值转成字符串

二、sscanf解包

(一)案例1:sscanf基础语法

(二)sscanf的高级用法

1、使用%*s、%*d跳过提取的内容(不要提取的内容)

2、使用%[n]s、%[n]d来提取指定宽度n的字符串或数据

3、%[a-z]用来提取a-z的字符串

4、%[aBc]提取aBc这三个字符

5、%[^abc] 只要不是abc字符,任何一个都要

(三)综合应用

1、提取字符串中指定的内容


一、sprintf组包(了解)

  • 格式:int sprintf(buf,"格式",数据)

  • buf:用来存放组好的报文

  • "格式":按照格式组包

  • 数据:各个零散的数据

  • 返回值:组好的报文的实际长度(不包含'\0')

(一)案例1:将2022 9 24这三个数据组成一个“2022年9月24日”

int year = 2022;
int mon = 9;
int day = 24;
int len = 0;
char buf[128]="";

// %d 和 year 类型要一一对应
len = sprintf(buf,"%d年%d月%d日", year, mon, day);
printf("len = %d\n", len); // 13,其中中文以两个字节存放
printf("buf=%s\n",buf); // 2022年9月24日

(二)案例2:将一个人的姓名、年龄、性别、家庭地址组成要求的格式

char name[]="幽默的彩旗";
int age = 18;
char sex[]="男";
char addr[]="合肥市包河区";
char buf[128]="";
int len = 0;

len = sprintf(buf,"姓名:%s 年龄:%d 性别:%s 地址:%s", name, age, sex, addr);
printf("len = %d\n",len); // 49
printf("buf=%s\n",buf); // 姓名:幽默的彩旗 年龄:18 性别:男 地址:合肥市包河区

(三)案例3:将数值转成字符串

 int num = 2020;
 char buf[128]="";

 sprintf(buf,"%d",num);
 printf("buf=%s\n", buf); // "buf=2020"

二、sscanf解包

  • 与sprintf相对应,从给定的字符串中按格式提取数据给到变量

(一)案例1:sscanf基础语法

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跳过提取的内容(不要提取的内容)

int data1=0;
// sscanf("1234 5678","1234 %d",&data1); // 5678
// sscanf("1234 5678","%*d %d",&data1); // 5678
sscanf("1234 5678","%*s %d",&data1); // 5678
printf("data1=%d\n",data1);

2、使用%[n]s、%[n]d来提取指定宽度n的字符串或数据

int data1 = 0;
int data2 = 0;
char buf[16]="";

sscanf("12abc5678","%*5s%d" ,&data1); // 5678
printf("data1=%d\n",data1);

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

3、%[a-z]用来提取a-z的字符串

  • 从头开始提取,遇到第一个不是a-z的字符结束

char buf[128]="";
// %[]都是按字符串提取
sscanf("abcDefABC","%[a‐z]",buf); // 识别到D时,没有别的格式提取就结束
printf("buf=%s\n", buf); // "abc"

4、%[aBc]提取aBc这三个字符

  • 从头开始提取,遇到第一个不是aBc当中的字符就结束
char buf[128]="";

sscanf("aaBBcEdef","%[aBc]",buf);
printf("buf=%s\n", buf); // aaBBc

5、%[^abc] 只要不是abc字符,任何一个都要

  • 从头开始提取,遇到第一个是abc当中的字符就结束

char buf[128]="";

sscanf("ABCcABC","%[^abc]",buf);
printf("buf=%s\n", buf); // ABC

(三)综合应用

1、提取字符串中指定的内容

char name[32]="";
char addr[32]="";

sscanf("youmodecaiqi@1360138.com","%[^@]%*1s%[^.]", name, addr); // 跳过一个字符
sscanf("youmodecaiqi@1360138.com"","%[^@]%*c%[^.]", name, addr); // %c提取@
sscanf("youmodecaiqi@1360138.com"","%[^@]@%[^.]", name, addr); // 用@来跳过
printf("name=%s\n", name); // "youmodecaiqi"
printf("addr=%s\n", addr); // "1360138"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

盾山狂热粉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值