不知道大家在格式化字符串的时候是怎么做的?是不是也通常使用 sprintf(buffer,"%s%d%s",.....) 这个函数吗?
而在VS2005下,会提示这个函数已经过期了,并建议用更加安全的 sprintf_s(buffer,size,"%s",.....); 来代替。
sprintf_s 虽然安全,但现在还不是c++标准。特别是考虑到多个编译环境或者跨平台的情况下,还是不能放弃sprintf。
原来的做法是判断不同的编译环境和平台环境,分别来处理。所以需要自己来写预编译的宏定义。
那有没有统一的解决方案?既可以安全,又不必写很多宏定义呢?
string跨平台很好,曾经想过用stl中的string来实现。但遇到格式字符串的时候,会觉得很不方便。一点一点的“+”,不爽,不如sprintf来的痛快。
otl是跨平台的。无意中看到otlv4.h中的定义,发现原来它使用格式化字符串时sprintf 做法竟也是使用的预编译的宏定义。呵呵。
暂时先延用这个方式吧。不过我自己再重新写一个format函数。这样毕竟可以少写一点宏定义。
void format(char* dest,size_t destlen,const char* fmt,...)
{
va_list args;
va_start(args, fmt);
#ifdef VC_ADVANCE
_vsnprintf_s(dest,destlen,destlen,fmt,args);
#else
_vsnprintf(dest,destlen,fmt,args);
#endif
va_end(args);
}
网上还找到了一个方法:
#include <sstream>
using namespace std;
ostringstream tostring;
tostring<<_T(This is a string")<<X<<endl;
//get string object
string a = tostring.str();
//get const char*
char* ss = aa.c_str();
用流的方式似乎似乎好一点,但还是不那么爽。呵呵。