std:string格式化字符串

      之前开发程序,如果需要格式化string对象,我会定义一个char类型的数组,数组大小一般会定义的非常大,比如10240,存放一般常用的串应该够长了,然后用sprintf对该数组格式化,之后再赋给string。最近开发程序,碰到了串的大小不确定的情况,所以要研究一下string的格式化问题。

      string没有提供给我们类似Format的函数,由于这个原因在代码里引入平台有关的MFC,ATL等本来不需要在项目中使用的一些重量级的框架,就为了能轻松的做格式化字符串 。曾尝试过将ATL::CString的format函数提取出来使用,但ATL::CString的底层调用了windows独有函数,无法跨越平台。所以要格式化string要找其他方法。

1.用boost:format

包含头文件#include

下面的例子说明boost::format简单的工作方式 

// 方式一 
 cout << boost::format("%s"% "输出内容" << endl; 
 
 
// 方式二 
 std::string s; 
 s 
= str( boost::format("%s"% "输出内容" ); 
 cout 
<< s << endl; 
 
 
// 方式三 
 boost::format formater("%s"); 
 formater 
% "输出内容"
 std::
string s = formater.str(); 
 cout 
<< s << endl; 
 
 
// 方式四 
 cout << boost::format("%1%"% boost::io::group(hex, showbase, 40<<
 endl; 


该方法比较好用,还有一些异常处理,此处不展开说,只说一点,在编译32位程序时,一切正常,但在编译64位程序时,只要用到了boost:format来格式化字符串时,从主函数返回时就会崩溃,跟进boost代码,发现了一个宏BOOST_NO_STD_LOCALE,只要在自己的程序里定义了这个宏,就能解决了,但是原因有待确认。


2.用stringstream

包含头文件#include

stringstream ss;
ss<string strtEST ;
ss>>strtEST;
或strtEST=ss.str();//推荐用后者,因为前者也会出现1中所说的崩溃,不知道是为什么


注意stringstream会有内存泄露,它的clear()函数不是清除内容,而是重置流状态标识,每次用完用str("")来清空内容,否则下次再用的话会和上次的串连在一起,最重要的是stringstream分配的内存只有当对像析构时才会释放,clear是不会释放内存的,所以在使用过程中,不要定义全局的stringstream对象,这样效率很低,最好的办法是用到的时候再定义

你可能感兴趣的:(std:string格式化字符串)