技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> 用 sscanf 解析字符串时结尾的判断

用 sscanf 解析字符串时结尾的判断

浏览:1447次  出处信息

常用 sscanf 解析字符串,处理错误也很简单:sscanf 会返回实际解析并赋值了的域的个数,判断一下是否和期望的一致即可。

今天却遭遇一个解析地址的 bug,是由于地址本应该是“127.0.0.1:30000”被写成 “127.0.0.1:30000:127.0.0.1:30000”,原来用 sscanf 解析,判断结果等于5就认为正确,却没有判断额外的字符。

修正:

以下是代码片段:
    bool Assign(const char* src)
    {
        unsigned int b1, b2, b3, b4;
        char dummy; // catch extra character 
        int count = sscanf(src, "%u.%u.%u.%u%c ", &b1, &b2, &b3, &b4, &dumm y);
        if (count == 4 && b1 < 256 && b2 < 256 && b3 < 256 && b4 < 256)
        {
            Assign((unsigned char)b1, (unsigned char)b2, (unsigned char)b3, (unsigned char)b4);
            return true;
        }
        return false;
    }

再去额外读一个字符,如果匹配,就是错误。

还有一个方法,就是使用 %n:

以下是代码片段:
    bool Assign(const char* src)
    {
        unsigned int b1, b2, b3, b4;
        int bytes_parsed; // 
        int count = sscanf(src, "%u.%u.%u.%u%n ", &b1, &b2, &b3, &b4, & bytes_parsed );
        if (count == 4 && bytes_parsed == strlen(src) && b1 < 256 && b2 < 256 && b3 < 256 && b4 < 256)
        {
            Assign((unsigned char)b1, (unsigned char)b2, (unsigned char)b3, (unsigned char)b4);
            return true;
        }
        return false;
    }

%n 会把当前读取了多少字节放入 int 类型的结果中。

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1