• sscanf解析复杂字符串,双引号通配符的使用问题


    在一段字符串处理时,使用sscanf函数出现问题:

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int id = 0;
        char str[32];
        char mode[8];
        char ip[32];
    
        memset(mode, 0, sizeof(mode));
        memset(ip, 0, sizeof(ip));
        memset(str, 0, sizeof(str));
        strcpy(str, "1,"IP","192.168.1.1"");
    
        /* 1,"IP","192.168.1.1" */
        printf("str = %s
    ", str);
    
        /* "%s" */
        sscanf(str, "%d,"%s","%s"", &id, mode, ip);
    
        /* id = 1, mode = IP","192.168.1.1", ip = 1.1" */
        printf("id = %d, mode = %s, ip = %s
    ", id, mode, ip);
        
        return 0;
    }
    


    要解析的字符串为 1,"IP","192.168.1.1"
    经过上述代码,结果比较奇怪,怀疑是"%s"这样的匹配形式有问题,因为虽然加了双引号转义,但是sscanf函数并没有安装预想结果来解析;
    查了一下资料,找到了一种比较好的解决方法,我比较low,之前并没有用过通配符,这样学习了一下
    修改后的代码为

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        int id = 0;
        char str[32];
        char mode[8];
        char ip[32];
    
        memset(mode, 0, sizeof(mode));
        memset(ip, 0, sizeof(ip));
        memset(str, 0, sizeof(str));
        strcpy(str, "1,"IP","192.168.1.1"");
    
        /* 1,"IP","192.168.1.1" */
        printf("str = %s
    ", str);
    
        /* "%[^"]" */
        sscanf(str, "%d,"%[^"]","%[^"]"", &id, mode, ip);
    
        /* id = 1, mode = IP, ip = 192.168.1.1 */
        printf("id = %d, mode = %s, ip = %s
    ", id, mode, ip);
        
        return 0;
    }
    

     这样显示的结果就正确了。

  • 相关阅读:
    5.4.3 果园里的树
    5.3.2 字母重排
    5.3.1 6174问题
    Codeforces Round #253 (Div. 2), problem: (B)【字符串匹配】
    POJ1054 枚举【STL__binary_search()_的应用】
    432B
    0x3f3f3f3f...编程中无穷大常量的设置技巧
    2014年百度之星程序设计大赛 资格赛第一题 (longlong)
    Tarjan
    Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template
  • 原文地址:https://www.cnblogs.com/hancq/p/5014393.html
Copyright © 2020-2023  润新知