警惕sscanf的使用

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

 

案例

 

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

 

 

 

 

 

原因分析

代码里面会先在类似于1_2_3,4_5_6这样的字符串后面先append一个逗号’  然后使用sscanf来解析{type, id, num}三元组,当参数解析正常的时候,typeidnumn会分别对应1, 120, 6, 8。但是配置里面多加了一个分号’;’, 导致实际的字符串成了”1_120_6;,”这种形式,sscanf在解析的时候type,id,num都被正确的赋值,但是sscanf视图匹配一个逗号’,’的时候却意外的遇到了数字6后面的分号’;’,这时候sscanf会停止解析,%n不会被解析,对应的变量n也不会被赋值。但是由于typeidnum解析成功,sscanf会返回3while循环将继续。而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个元组(第四个元组是多余的,而且是错误的)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值