用 sscanf 解析字符串时结尾的判断
浏览:1848次 出处信息
常用 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天十大热文
-
[1166] WordPress插件开发 -- 在插件使用 -
[66] 解决 nginx 反向代理网页首尾出现神秘字 -
[47] Java开发岗位面试题归类汇总 -
[44] web开发设计人员不可不用的在线web工具和 -
[33] Rax 系列教程(长列表) -
[32] 手机产品设计方向 -
[32] 一句话crontab实现防ssh暴力破解 -
[30] 如何建立合适的索引? -
[29] 程序员疫苗:代码注入 -
[28] oracle技术方面的路线