Pocket PC 2002STLWindows MobileVisual C++ 7.0Windows 2000Visual C++ 6.0Windows XP中级开发Visual StudioWindowsC++
构建 STL 字符串的快速便捷方法。





4.00/5 (15投票s)
构建 STL 字符串的快速便捷方法。
引言
这可能是你在 Code Project 上看到的篇幅最短的文章之一,但这里介绍的一行(!)代码我发现非常实用,所以想和大家分享。另外,我也想稍微提高一下我的文章数量 :-)
stringstream
对于构建字符串非常有用。不再需要担心 sprintf
缓冲区溢出,也不需要费力地将参数与格式字符串中的占位符匹配。例如,你可以这样使用它
#include <sstream> int theAnswer = 42 ; // build the string std::ostringstream buf ; buf << "The answer is: " << theAnswer ; std::string str = buf.str() ; cout << "My string = " << str << endl ;
但我发现每次都创建 stringstream
变量很繁琐,尤其是在同一个作用域内有多个变量时,因为你必须为每个变量赋予一个唯一的名称。所以我编写了以下宏
#define MAKE_STRING( msg ) ( ((std::ostringstream&)(std::ostringstream() << msg)).str() )
它创建一个临时的 stringstream
对象,将消息流式传输到其中,并在完成后返回字符串缓冲区。请注意,由于运算符<<()
返回对 ostream
的引用,但我们需要一个 ostringstream
来访问底层的字符串缓冲区,因此需要进行类型转换。你可以这样使用它
std::string str = MAKE_STRING( "The answer is: " << theAnswer ) ;
当你只需要一个临时字符串对象时,它会变得更加方便,例如:
extern void processString( const std::string& ) ; processString( MAKE_STRING( "The answer is: " << theAnswer ) ) ;
我还有一个版本,如果需要的话,可以返回 C 风格的 char*
指针
#define MAKE_CSTRING( msg ) ( ((std::ostringstream&) (std::ostringstream() << msg)).str().c_str() ) char buf[ 1024 ] ; strcpy( buf , MAKE_CSTRING("The answer is: " << theAnswer) ) ;
这里需要注意的一点是,返回的 char*
指针指向一个临时对象。所以在上面的例子中,没问题,因为字符串对象会在 strcpy(
) 返回后一直存在。但这样做是错误的
const char* pDontTryThisAtHome = MAKE_CSTRING( "The answer is : " << theAnswer ) ; printf( "%s\n" , pDontTryThisAtHome ) ;
结论
就这样了!文章数量:2。