必威体育Betway必威体育官网
当前位置:首页 > IT技术

警惕sscanf的使用

时间:2019-09-29 19:44:35来源:IT技术作者:seo实验室小编阅读:64次「手机版」
 

sscanf

 sscanf跟scanf类似,只不过sscanf是扫描字符串,而scanf是扫描标准输入,用得好的话会给解析带来极大的便利性,用的不好的话,可能导致程序陷入死循环,进而导致cpu 100%。

案例

可能不会像你预期的一样,得到一个三元组{1, 120, 6}, 而是让你得到无数个三元组:

原因分析

代码里面会先在类似于1_2_3,4_5_6这样的字符串后面先APPend一个逗号’,’ , 然后使用sscanf来解析{type, id, num}三元组,当参数解析正常的时候,type,id,num,n会分别对应1, 120, 6, 8。但是配置里面多加了一个分号’;’, 导致实际的字符串成了”1_120_6;,”这种形式,sscanf在解析的时候type,id,num都被正确的赋值,但是sscanf视图匹配一个逗号’,’的时候却意外的遇到了数字6后面的分号’;’,这时候sscanf会停止解析,%n不会被解析,对应的变量n也不会被赋值。但是由于type,id,num解析成功,sscanf会返回3,while循环将继续。而n有一个初始值0,进而导致了偏移(p += n)失败,p还在原地踏步。最终while循环进入了死胡同。

解决措施

1)    在while入口处判断n的合法性

2)            在n被使用完后,将n赋值为0。

再次运行,程序会提示输入错误:

纠正错误,继续运行:

这次终于对了。

附加说明

如果缺少解决错误第二步的清0操作,逻辑一样会有问题,假如解析”1_2_3,4_5_6,111111111_88_9;”, 不会像我们预期的那样得到3个元组:

而是得到了4个元组(第四个元组是多余的,而且是错误的):

感兴趣的话,可以分析一下

相关阅读

sscanf的用法

sscanf的作用:从一个字符串中读进于指定格式相符的数据。利用它可以从字符串中取出整数、浮点数和字符串。 sscanf和scanf的区别:sc

分享到:

栏目导航

推荐阅读

热门阅读