Error[8]: Undefined offset: 14, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

一、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:用来存放组好的报文

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

  • 数据:各个零散的数据

  • 返回值:组好的报文的实际长度(不包含'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日')

(一)案例1:将2022 9 24这三个数据组成一个“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解包

  • 与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、%*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的字符串
  • 从头开始提取,遇到第一个不是aBc当中的字符就结束
  • 4、%[aBc]提取aBc这三个字符
    char buf[128]="";
    
    sscanf("ABCcABC","%[^abc]",buf);
    printf("buf=%s\n", buf); // ABC
    5、%[^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、提取字符串中指定的内容
    [+++]

    )
    File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
    File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
    File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
    C语言---sprintf组包、sscanf解包_C_内存溢出

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

    C语言---sprintf组包、sscanf解包,第1张

    目录

    一、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:用来存放组好的报文

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

    • 数据:各个零散的数据

    • 返回值:组好的报文的实际长度(不包含'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日')

    (一)案例1:将2022 9 24这三个数据组成一个“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解包

    • 与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、%*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的字符结束

  • 从头开始提取,遇到第一个不是aBc当中的字符就结束
  • 4、%[aBc]提取aBc这三个字符
      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、提取字符串中指定的内容
     
    

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/langs/3002876.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-09-27
    下一篇 2022-09-27

    发表评论

    登录后才能评论

    评论列表(0条)

    保存