sprintf sprintf_s ... 格式化字符串 统一之路?

不知道大家在格式化字符串的时候是怎么做的?是不是也通常使用 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();

 

用流的方式似乎似乎好一点,但还是不那么爽。呵呵。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值