zoukankan      html  css  js  c++  java
  • sscanf函数——强大的C语言库函数

    这个函数真的很强大,这篇随笔也将一直更新一些总结,直到涵盖大多数应用:

    eg1:

    今天公司项目中从云端获取了一段字符串---"+CBC: 0,90,4090"

    我想获取其中的数字0,90,4090.我们当然可以写一个函数,判断,并且逐一取值,然后再糅合成想要的数据,但是这样也真的太麻烦了,于是sscanf就来了。

    #include<stdio.h>
    int main(void)
    {
        int a;
        int b;
        int c;
        char *s="+CBC: 0,90,4090";
        sscanf(s,"+CBC: %d,%d,%d",&a,&b,&c);
        printf("%d %d %d
    ",a,b,c);
        return 0;
    }

    是不是很简单就完成了字符串中数字提取,而且可以格式化输入。

    其中需要注意的是,一定要对应清楚,上面字符串中 +CBC: (空格)所以在sscanf中也一定要对应,空格别人有,你也得有,还有就是格式化的时候,如果以字符输入的形式,只能读取一个字节(当然是在char为一个字节的机器上)。

    #include<stdio.h>
    int main(void)
    {
        int a;
        int b;
        char c;
        char *s="+CBC: 0,90,4090";
        sscanf(s,"+CBC: %d,%d,%c",&a,&b,&c);
        printf("%d %d %c
    ",a,b,c);
        return 0;
    }

    上面红色部分,只是改成%c的形式,输出将只有一个字节:

    sscanf函数,是把一个字符串按照格式化输入到指定内存中,常用于字符串转化成十进制,十六进制,获取指定位置的指定类型值。但是它却支持如同正则表达式一样的东西。

    eg2:

    #include<stdio.h>
    int main(void)
    {
        char str[10];
        char *s="abcdefghijk";
        sscanf(s,"%6s",str);
        printf("%s
    ",str);
        return 0;
    }

     如果我们传输的字符串没有到达末尾的'',就如同上面的例子那样,那么sscanf会在字符串后面给我们加上''以表示字符串结束标志,所以我上面才敢直接使用。虽然翻了C语言标准它并未提及这个。

    eg3:取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串,只要不是空格就读取:

    #include<stdio.h>
    int main(void)
    {
        char str[20];
        char *s="kongge jieshu";
        sscanf(s,"%[^ ]",str);//注意^后面有个空格
        printf("%s
    ",str);
        // for(int i=0;i<10;i++)
            // printf("%c ",str[i]);
        return 0;
    }

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

    #include<stdio.h>
    int main(void)
    {
        char buf[30];
        
        char *s="123456aAbBcCdDeEfF";
        sscanf(s, "%[1-9a-z]", buf);
        printf("%s
    ", buf);
        
        char *s1="123456abcdefABCDEF";
        sscanf(s1, "%[1-9a-z]", buf);
        printf("%s
    ", buf);
        return 0;
    }

    只匹配制定字符集,遇到第一个不满足的就停止了,如输出的第一行,如果前面都是满足要求的,遇到不满足的就停止,如输出的第二行。

    eg5:给定一个字符串lios/hello world@122,获取 / 和 @ 之间的字符串:

    先将 "lios/"过滤掉,再将'@'前的一串内容送到buf中。

    #include<stdio.h>
    int main(void)
    {
        char buf[30];    
        sscanf("lios/hello world@122", "%*[^/]/%[^@]", buf);
        printf("%s
    ", buf);
        return 0;
    }

    *[^/]/:表示任意字符,直到/符号停止(不匹配/字符)->得到lios,然后*[^/]后面又一个/:在上面就表示lios/

    [^@]:表示直到@停止,这样操作之后,取得就是/到@之间的字符。

    如果你不懂基础的正则表达式语法,看起来会很吃力,推荐掌握正则表达式,大大提高编程效率。

    sscanf远远不止这点作用,更多待续...

  • 相关阅读:
    Codeforces 985G. Team Players
    关于Hall定理的学习
    bzoj 4561: [JLoi2016]圆的异或并
    UOJ #188. 【UR #13】Sanrd
    LOJ #6053. 简单的函数
    Codeforces F. Cowmpany Cowmpensation
    POJ 3710:Matrix Power Series
    codeforces533E
    luogu2885
    codeforces722E
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/7414242.html
Copyright © 2011-2022 走看看