zoukankan      html  css  js  c++  java
  • C语言 sscanf用法详解

    /* sscanf用法详解 */
    
    #include <stdio.h>   /* sscanf头文件 */
    #include <stdlib.h>
    #include <string.h>
    
    /*
    sscanf 读取格式化的字符串中的数据。
    swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。
    
    函数语法
    int sscanf(const char *str, const char *format, ...);
    
    参数
    str
        输入源固定字符串
    format
      格式化参数,format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符号}
      */
    
    void test()
    {
        /*
        //* 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
        const char *p1 = "abcd123";
        char buf1[32] = { 0 };
        sscanf(p1, "%*[a-z]%s", buf1); //跳过字母
        printf("-- buf1[%s]--
    ", buf1);
    
        //[a|b|c]表示a,b,c中选一
        const char *p2 = "3b";
        char buf2_1[32] = { 0 };
        char buf2_2[32] = { 0 };
        sscanf(p2, "%[1|2|3]%c", buf2_1, buf2_2);  //或运算符使用
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf2_1, buf2_2);
        
        //[d],表示可以有d也可以没有d。
        const char *p3 = "b";
        char buf3_1[32] = { 0 };
        char buf3_2[32] = { 0 };
        sscanf(p3, "%[3]%c", buf3_1, buf3_2);  //无法提取任何数据
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf3_1, buf3_2);
        
        //[d],表示可以有d也可以没有d。
        const char *p4 = "b";
        char buf4_1[32] = { 0 };
        char buf4_2[32] = { 0 };
        sscanf(p4, "%c%[3]", buf4_1, buf4_2);  //可以正常提取b
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf4_1, buf4_2);
        //结论:sscanf提取字符串必须知道字符串的具体格式,使用上不如正则灵活
        
        //width表示读取宽度。
        const char *p5 = "abcdef123";
        char buf5_1[32] = { 0 };
        char buf5_2[32] = { 0 };
        sscanf(p5, "%3s%s", buf5_1, buf5_2);  //%3s 表示提取3个字符的字符串
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf5_1, buf5_2);
        
        // h|I|I64 是配合%d提取整数使用 L 是配合%f提取浮点数使用,h表示short类型数据,I表示int类型数据,I64表示长整型数据
        const char *p6 = "123578abc";
        int buf6_1;
        char buf6_2[32] = { 0 };
        sscanf(p6, "%Id%s", &buf6_1, buf6_2);
        printf("-- buf1[%d]--buf2_2[%s]---
    ", buf6_1, buf6_2);
        
        //控制字符
        //  %c 一个单一的字符
        //    %d 一个十进制整数
        //    %i 一个整数
        //    %e, %f, %g 一个浮点数
        //    %o 一个八进制数
        //    %s 一个字符串
        //    %x 一个十六进制数
        //    %p 一个指针
        //    %n 一个等于读取字符数量的整数
        //    %u 一个无符号整数
        //    %[] 一个字符集
        //    %% 一个精度符号
        const char *p7 = "123578abc";
        char ch7 = 0;
        char buf7_2[32] = { 0 };
        sscanf(p7, "%c%s", &ch7, buf7_2);
        printf("-- buf1[%c]--buf2_2[%s]---
    ", ch7, buf7_2);
        
        //sscanf函数遇到空格停止读取字符串,所有需要特地注明空格
        const char *p8 = "123   578a  bc";
        char buf8_1[32] = { 0 };
        char buf8_2[32] = { 0 };
        sscanf(p8, "%s%*[ ]%s", buf8_1,buf8_2); //格式化里有空格,可以提取
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf8_1, buf8_2);
        
        //^ 取到指定字符为止的字符串
        const char *p9 = "123abc";
        char buf9_1[32] = { 0 };
        char buf9_2[32] = { 0 };
        sscanf(p9, "%[^2]%s", buf9_1,buf9_2);
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf9_1, buf9_2);
        
        //截取到指定字符串 "3ab"
        const char *p10 = "12-3ab-c";
        char buf10_1[32] = { 0 };
        char buf10_2[32] = { 0 };
        sscanf(p10, "%*[^-]-%[^-]%s", buf10_1, buf10_2); 
        printf("-- buf1[%s]--buf2_2[%s]---
    ", buf10_1, buf10_2);
        */
    
        //%n的使用,返回前一个提取字符个数,一般
        const char *p11 = "12345dfg";
        int num = 0;
        sscanf(p11, "%*d%n%*s", &num);
        printf("-- buf1[%d]--buf2[%s]--
    ", num, p11 + num);//注意其用法,节省内存,通过偏移量展示字符串
    
    
    }
    
    int main()
    {
        test();
        printf("-----ok------
    ");
        getchar();
        return 0;
    }
  • 相关阅读:
    基于golang的分布式任务管理系统
    golang sql 包连接池分析
    Go web框架构建三层架构
    004-位置参数变量
    003_1-当前系统语言的相关知识
    003-环境变量
    002-自定义变量
    001--变量概述
    2017-07-04(sudo wc sort)
    优化分页的查询
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/10657161.html
Copyright © 2011-2022 走看看