目录
一、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组包(了解)
(一)案例1:将2022 9 24这三个数据组成一个“2022年9月24日”
格式:int sprintf(buf,"格式",数据)
buf:用来存放组好的报文
"格式":按照格式组包
数据:各个零散的数据
返回值:组好的报文的实际长度(不包含'
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日
')
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 性别:男 地址:合肥市包河区
(二)案例2:将一个人的姓名、年龄、性别、家庭地址组成要求的格式
int num = 2020;
char buf[128]="";
sprintf(buf,"%d",num);
printf("buf=%s\n", buf); // "buf=2020"
(三)案例3:将数值转成字符串
从给定的字符串中按格式提取数据给到变量
二、sscanf解包
(一)案例1:sscanf基础语法
- 与sprintf相对应,跳过提取的内容
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、%*dint 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);
(不要提取的内容)
指定宽度n的字符串或数据
2、使用%[n]s、%[n]d来提取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"
char buf[128]="";
// %[]都是按字符串提取
sscanf("abcDefABC","%[a‐z]",buf); // 识别到D时,没有别的格式提取就结束
printf("buf=%s\n", buf); // "abc"
3、%[a-z]用来提取a-z的字符串
-
从头开始提取,遇到第一个不是a-z的字符结束
char buf[128]="";
sscanf("aaBBcEdef","%[aBc]",buf);
printf("buf=%s\n", buf); // aaBBc
char buf[128]="";
sscanf("ABCcABC","%[^abc]",buf);
printf("buf=%s\n", buf); // ABC
5、%[^abc] 只要不是abc字符,任何一个都要
-
从头开始提取,遇到第一个是abc当中的字符就结束
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"
(三)综合应用
1、提取字符串中指定的内容
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)