用 sscanf 解析字符串时结尾的判断
浏览:1443次 出处信息
常用 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技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:为什么要用公钥/私钥而不是密码去做SSH身份验证
后一篇:学习:一个并发的Cache >>
文章信息
- 作者:陈峰 来源: chen3feng的专栏
- 标签: sscanf 结尾
- 发布时间:2010-08-02 10:22:38
近3天十大热文
- [66] Go Reflect 性能
- [66] Oracle MTS模式下 进程地址与会话信
- [65] 如何拿下简短的域名
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [47] 读书笔记-壹百度:百度十年千倍的29条法则