职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 601|回复: 0

VC++使用sprintf的常见问题

[复制链接]
芷馨 发表于 2011-10-6 09:41 | 显示全部楼层 |阅读模式
  sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访
  问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通
  常用眼睛再把出错的代码多看几眼就看出来了。
  ?? 缓冲区溢出
  第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问
  题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
787014552a9aa693b645ae78.jpg

  ?? 忘记了第一个参数
  低级得不能再低级问题,用printf 用得太惯了。//偶就常犯。:。(
9f1011b38aa00ff0d8335a78.jpg

  ?? 变参对应出问题
  通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤
  其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”,编译器会觉得你
  欺她太甚了(编译器是obj 和exe 的妈妈,应该是个女的,)。
964b2e4e709ad89dd0c86a79.jpg

  strftime
  sprnitf 还有个不错的表妹:strftime,专门用于格式化时间字符串的,用法跟她表哥很像,也
  是一大堆格式控制符,只是毕竟小姑娘家心细,她还要调用者指定缓冲区的最大长度,可能是为
  了在出现问题时可以推卸责任吧。这里举个例子:
  time_t t = time(0);
  //产生"YYYY-MM-DD hh:mm:ss"格式的字符串。
  char s[32];
  strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));
  sprintf 在MFC 中也能找到他的知音:CString::Format,strftime 在MFC 中自然也有她的同道:
  CTime::Format,这一对由于从面向对象哪里得到了赞助,用以写出的代码更觉优雅。 0b07ec1f5d8f2634f724e47b.jpg

相关帖子

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-19 12:42 , Processed in 0.155515 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表