65.9K
CodeProject 正在变化。 阅读更多。
Home

构建 STL 字符串的快速便捷方法。

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (15投票s)

2002年12月17日

CPOL

1分钟阅读

viewsIcon

120156

构建 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。

© . All rights reserved.