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

常用 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 类型的结果中。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值