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吧,永远不要使用它了.   
posted @ 2011-09-13 19:34  Love Lyre  阅读(8052)  评论(3编辑  收藏  举报