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;
    }
  • 相关阅读:
    现代软件工程 第一章 概论 第3题——韩婧
    现代软件工程 第一章 概论 第2题——韩婧
    小组成员邓琨、白文俊、张星星、韩婧
    UVa 10892 LCM的个数 (GCD和LCM 质因数分解)
    UVa 10780 幂和阶乘 求n!中某个因子的个数
    UVa 11859 除法游戏(Nim游戏,质因子)
    Codeforces 703C Chris and Road 二分、思考
    Codeforces 703D Mishka and Interesting sum 树状数组
    hdu 5795 A Simple Nim SG函数(多校)
    hdu 5793 A Boring Question 推公式(多校)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/10657161.html
Copyright © 2011-2022 走看看