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 等不做讨论)
总结:
- 如果只是将一个值转化为字符串,尽量使用lexical_cast,如果你正在使用boost库的话,如果是格式化,请使用boost::format
- 如果没有安装boost,或者还要进行格式换字符串,尽量使用stringstream
- 如果你在windows下工作,并且追求效率,请使用安全字符串函数StringCchPrintf
- 再如果的话,你是该考虑_snprintf ,snprintf?
- 最后,放弃sprintf吧,永远不要使用它了.