正在进行的项目中有个网络传输模块,需要在设备端将上位机发送的XML命令解析出来并转发到其它模块。在我测试一个获取数据的命令时,发现上位机读取到的数据是错误,看XML命令格式,明明是对的,但读到的数据就是不正确,肯定有问题。因为网络传输模块在其它项目一直使用,一直OK,现在出问题了,很郁闷。于是使出printf大法跟踪、终于找到问题原因。原来,又是sscanf搞的问题。记得小弟刚来这家公司时接手前人写的ftp模块,里面大量用了sscanf,还专门写了篇文章。现在又遇到了。

这个XML命令是自定义的,格式类似:大人[1],大奔[黄],大小[250],中括号表示为传递的参数,其中既有数字(%d)也有字符串(%s),一开始还以为是中文搞的鬼,后来查发现是只要是字符中在命令的中间,使用sscanf的%s就会将该字符串及以后的所有的字符都解析到,因此,字符串后面的数据就不正确了。

一开始想着使用字符串查找strchr逐个字符来查找、确定每一个参数,但那个命令一共有20多个参数,这点我是不能接受的。后来再调试一下,发现只要将有字符串的参数放到最后就可以了。至于最后有个右中括号,则可以将它直接写'\0'来解决。

不过这种方法,只能适用于只有一个字符串的情况。如果复杂的情况,最终的方法是重新制定命令的格式。

示例代码如下:

void sscanf_test()

{
    char* buff = "wo:[12],ni:[25],ta:[中文我顶]";
    char wo[32] = {0};
    char ni[32] = {0};
    char ta[32] = {0};
    char buffer[128] = {0};
    int wo1, ni1, ta1;
    printf("test1:\n");
    sscanf(buff, "wo:[%d],ni:[%d],ta:[%s]", &wo1, &ni1, ta);
    printf("output1:wo: %d \nni: %d \nta: %s\n", wo1, ni1, ta);

char* buff1 = "wo:[12],ni:[结束了还来],ta:[250]";
    printf("test2:\n");
    sscanf(buff1, "wo:[%d],ni:[%s],ta:[%d]", &wo1, ni, &ta1);
    printf("output2:wo: %d\nni: %s \nta: %d\n", wo1, ni, ta1);

}

输出:

test1:
output1:wo: 12 
ni: 25 
ta: 中文我顶]
test2:
output2:wo: 12
ni: 结束了还来],ta:[250] 
ta: 7 // 此处已是错误的了

李迟 2015年1月18日 周日 下午

再记一下sscanf的一个小问题相关推荐

  1. 身为程序员别再无脑学习撩妹小技巧,这篇聊天基础先记牢!

    别再无脑学习撩妹小技巧,这篇聊天基础先记牢! 干货 作为一个曾经的话题废,十分理解各位的心情,这篇文章希望可以帮助所有在聊天和社交上有问题的朋友. 这是一个真实写给聊天小白的科普文. 全文分成四个阶段 ...

  2. 将一个正方形分成4个大小一样的小正方形,再将其中一个小正方形分成4个小正方形,如此类推,分割n次是几个正方形?

    问题: 将一个正方形分成4个大小一样的小正方形,再将其中一个小正方形分成4个小正方形,如此类推,分割n次是几个正方形? 解答:        一次分割都是将一个分成4个,增加了3(1*3)个:     ...

  3. C语言:使用指针,封装一个函数, // 使输入的奇数从小到大排列,奇数排列完毕之后,再把偶数从大到小进行排列, // 最终输出整个

    // 使用指针,封装一个函数, // 使输入的奇数从小到大排列,奇数排列完毕之后,再把偶数从大到小进行排列, // 最终输出整个 #include <stdio.h> void Jopai ...

  4. 一个小需求,能够做到月活跃用户5000万,就是真牛逼!

    来自:Java面试那些事儿 这篇文章是之前写的文章,我觉得还是对不少同学有所帮助,因为生活让大家都太浮躁,很难沉下心来认真做一件事,本文既是给大家推荐一款好用的Chrome插件,同时也给大家讲述这款插 ...

  5. 程序员们请别做下一个小贝

    据网友提供的<蜗居>第24集3:30秒截图,有理由相信小贝是搞 C++ 的 那本书是<大规模C++程序设计> -- 历史上一定有那么一些人,没有名,没有钱,只是和爱人一起过完了 ...

  6. 别再搜集面经啦!小夕教你斩下NLP算法岗offer!

    推完上一篇文章,订阅号和知乎后台有好多小伙伴跟小夕要面经(还有个要买简历的是什么鬼),然鹅小夕真的没有整理面经呀,真的木有时间(。 ́︿ ̀。).不过话说回来,面经有多大用呢?最起码对于NLP岗位的面 ...

  7. Autobook中文版(七)—9.一个小的GNU Autotools项目

    9.一个小的GNU Autotools项目 本章介绍一个真实的小例子,演示一些GNU Autotools具有的特性,指明一些GNU Autotools使用上的陷阱.所有的源码能被下载从本书的主页上.这 ...

  8. 生成句法分析树以及从一个小例子来看词义消歧及语义角色标注

    一.生成句法分析树 把一句话按照句法逻辑组织成一棵树,由人来做这件事是可行的,但是由机器来实现是不可思议的,然而算法世界就是这么神奇,把一个十分复杂的过程抽象成仅仅几步操作,甚至不足10行代码,就能让 ...

  9. 同感,在另外一个小华为待过,也差不多是这样的

    最近很多朋友咨询的一些硬件问题,发现朋友们没有仔细的看datasheet,也没有好好的做电路分析.我讲一讲华为是怎么做硬件开发的,给正在做硬件开发的朋友一些启示.说的不对的地方,大家批评指正. 曾经2 ...

最新文章

  1. hbase shell编码显示中文
  2. 机器学习是深度学习之母
  3. java 硬件交互_Java关键字之native
  4. java多线程 门闩_Java线程与并发编程实践----同步器(倒计时门闩,同步屏障)...
  5. 支持向量机原理(二)
  6. python实现气象数据分析统计服_Python数据分析实战:降雨量统计分析报告分析
  7. 我只注视你全cg存档_在暴戾的他怀里撒个娇 作者:春风榴火全娱乐圈都在等我们离婚作者:魔安...
  8. jasperReport Studio java报表设计(详细)
  9. 【leetcode】在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
  10. 如何在命令行更改IP地址
  11. Git pull(拉取),push(上传)命令整理
  12. 明解C语言 【日】 柴田望洋 第十章 指针 代码清单和练习代码
  13. Linux环境下进行本地Blast比对——操作流程
  14. 微信小程序上线缓存及解决办法
  15. 如何在html页面中左尖括号,想要在HTML中显示一个尖括号“
  16. 苏黎世联邦理工学院计算机科学系,苏黎世联邦理工大学专业设置
  17. scilab 数组和字符串
  18. docker镜像容器创建和保存
  19. 苹果6s要下岗了,预算5000给推荐一款手机呗?
  20. 学什么编程语言的比较有前景?

热门文章

  1. html按钮样式_一组强大的CSS3 Material 按钮
  2. python处理网页弹窗_Selenium2+Python自动化-处理浏览器弹窗(转载)
  3. 如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量
  4. “曲屏版iPhone 13 Pro” 2799元!荣耀60 SE新版上架:12GB+256GB超大存储
  5. 这个80后靠王者荣耀赚到93亿身家
  6. 上市之前再被爆出安全问题 卫龙辣条被爆吃出“锁精环”
  7. 5G iPhone SE或将在明年一季度推出 明年有望生产3000万部
  8. 319元!特斯拉卡车造型哨子发布 马斯克:快来买 别给苹果抛光布交智商税
  9. 微软冷箭射苹果:世界需要更开放的平台
  10. 阿里拍卖官方客服全面升级 推出一对一教你“一站式服务”