sprintf以及字符串格式化

sprintf是传统的c字符串格式化函数.用法:

    #include<stdio.h>
char buffer[10];
sprintf(buffer,
"%d",6666);//将一个整形值转化为c字符串形式

其优点:  1.效率最佳   2. 易用性与清晰性

缺点:     1.长度安全性引起缓冲区溢出,破坏内存  2. 类型安全性问题    3. 不能应用于模板

在windows平台中 winsdk提供了安全字符串系列函数,来取代传统的有缓冲区溢出的字符串函数.实例:

        #include<Strsafe.h>
char buffer[30];
StringCchPrintf(buffer,
30, "%d",6666); 

      windows下的c或倾向于c的c++程序应该使用安全字符串函数代替旧的函数.在vc2010环境实测,同时包含stdio.h, Strsafe.h则sprintf(buffer,"%d",6666);编译不能通过:提示让用安全的StringCchPrintf函数代替sprintf.snprintf 和_snprintf也同样该被StringCchPrintf替代. 

下面来看c++的替代方案.

   1.std::stringstream,其优点和缺点正和sprintf相反

        #include <sstream>
ostringstream temp;
temp
<<6666;
cout
<<temp.str();

  

   2.boost::lexical_cast,是stringstream的包装类,它并不是为格式化字符串而生(boost::format),它的作用是数据类型转化.因该和C里面的atoi等转换函数放在一起讨论.其实现代码大致为:

    template<typename Target, typename Source>
Target lexical_cast(Source arg)
{
Target result;
if(!(interpreter << arg && interpreter >> result))
BOOST_LCAST_THROW_BAD_CAST(Source, Target);
return result;
}
 

    使用方法:

    #include "boost/lexical_cast.hpp"

    string result=lexical_cast<string>(6666); 

 3. boost::format ,请参考boost文档


(boost作为准标准库,值得讨论, MFC中的CString.Format 等不做讨论)


总结:

  1.     如果只是将一个值转化为字符串,尽量使用lexical_cast,如果你正在使用boost库的话,如果是格式化,请使用boost::format
  2.     如果没有安装boost,或者还要进行格式换字符串,尽量使用stringstream
  3.     如果你在windows下工作,并且追求效率,请使用安全字符串函数StringCchPrintf
  4.     再如果的话,你是该考虑_snprintf ,snprintf?
  5.     最后,放弃sprintf吧,永远不要使用它了.   

转载于:https://www.cnblogs.com/LoveLyre/archive/2011/09/13/2175030.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值