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和scanf的区别:sc