zoukankan      html  css  js  c++  java
  • sscanf

    #include<stdio.h>

    1、sscanf和scanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备

    2、sscanf的使用,以解析时间字符串为例,将字符串“2009-01-02_11:12:13”解析为整型年月日时分秒

    //定义
     char cc;
     tm tm_temp={0};
     string stime("2009-01-02_11:12:13");

    //(1) 必须严格按照分隔符形式匹配填写,若遇到不匹配项则终止解析

     sscanf(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d",
      &tm_temp.tm_year,
      &tm_temp.tm_mon,
      &tm_temp.tm_mday,
      &tm_temp.tm_hour,
      &tm_temp.tm_min,
      &tm_temp.tm_sec
      );
      
    //(2) 可以不按照分割符号形式填写,字符数必须一致,例如可以正确解析“2009/01/02_11:12:13”

     sscanf(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d",
      &tm_temp.tm_year, &cc,
      &tm_temp.tm_mon, &cc,
      &tm_temp.tm_mday, &cc,
      &tm_temp.tm_hour, &cc,
      &tm_temp.tm_min, &cc,
      &tm_temp.tm_sec
      );
     
    //(3) 可以不按照分割符号形式填写,字符数必须一致,同上,%1s可以等同于%c

     sscanf(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",
      &tm_temp.tm_year, &cc,
      &tm_temp.tm_mon, &cc,
      &tm_temp.tm_mday, &cc,
      &tm_temp.tm_hour, &cc,
      &tm_temp.tm_min, &cc,
      &tm_temp.tm_sec
      );

    //(4) 可以不按照分割符形式和数量填写,类型必须一致,例如可以正确解析“2009/01/02___11:12:13”
    //这里使用了sscanf的正则表达式,与通用的正则表示类似但不完全相同,%*c表示忽略连续多个字符

     sscanf(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",
      &tm_temp.tm_year,
      &tm_temp.tm_mon,
      &tm_temp.tm_mday,
      &tm_temp.tm_hour,
      &tm_temp.tm_min,
      &tm_temp.tm_sec
      );
      
    3、sscanf_s的使用

     //定义
     char cc[2];
     tm tm_temp={0};
     string stime("2009-01-02_11:12:13");

    //(1) 与sscanf第一种方法相同,可以使用"%4d-%2d-%2d_%2d:%2d:%2d"格式匹配解析

     sscanf_s(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d",
       &tm_temp.tm_year,
       &tm_temp.tm_mon,
       &tm_temp.tm_mday,
       &tm_temp.tm_hour,
       &tm_temp.tm_min,
       &tm_temp.tm_sec
       );
      
    //(2) 使用%c格式对数据解析时,必须对相应的缓冲区增加长度参数,否则将会出错

     sscanf_s(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d",
      &tm_temp.tm_year, &cc, 1,
      &tm_temp.tm_mon, &cc, 1,
      &tm_temp.tm_mday, &cc, 1,
      &tm_temp.tm_hour, &cc, 1,
      &tm_temp.tm_min, &cc, 1,
      &tm_temp.tm_sec
      );
      
    //(3) 使用%s格式对数据解析时,缓冲长度必须大于字符串长度,否则不予解析

     sscanf_s(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",
       &tm_temp.tm_year, &cc, 2,
       &tm_temp.tm_mon, &cc, 2,
       &tm_temp.tm_mday, &cc, 2,
       &tm_temp.tm_hour, &cc, 2,
       &tm_temp.tm_min, &cc, 2,
       &tm_temp.tm_sec
       );

    //(4) 与sscanf一样,sscanf_s同样支持正则表达式

     sscanf_s(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",
      &tm_temp.tm_year,
      &tm_temp.tm_mon,
      &tm_temp.tm_mday,
      &tm_temp.tm_hour,
      &tm_temp.tm_min,
      &tm_temp.tm_sec
      );
      
    通过以上对比sscanf与sscanf_s的使用,可以看出后者对缓冲区安全有了更多的考虑,从而避免了许多不经意的烦恼。

    大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可 能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。

      1. 常见用法。

    以下是引用片段:
      char str[512] = ;
      sscanf("123456 ", "%s", str);
      printf("str=%sn", str);

      2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

    以下是引用片段:
      sscanf("123456 ", "%4s", str);
      printf("str=%sn", str);

      3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

    以下是引用片段:
      sscanf("123456 abcdedf", "%[^ ]", str);
      printf("str=%sn", str);

      4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

    以下是引用片段:
      sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str);
      printf("str=%sn", str);

      5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

    以下是引用片段:
      sscanf("sscanf("123456abcdedfBCDEF", "%[^A-Z]", str);   printf("str=%sn", str);", str);
      printf("str=%sn", str);
     
  • 相关阅读:
    Tomcat gzip果然强大,js文件压缩率50%以上
    URAL 1748
    URAL 1698
    [置顶] Spring中自定义属性编辑器
    Java-类库:lombok
    专业词汇:日志(log)
    SpringBoot-application:application.yml/配置文件详解
    SpringBoot:目录
    Java-Maven-pom.xml-porject-parent:parent
    Java-Maven-pom.xml-project-packaging:packaging(war/jar)
  • 原文地址:https://www.cnblogs.com/chenyg32/p/3183078.html
Copyright © 2011-2022 走看看