这些天有什么用于'目的'?

时间:2010-02-25 23:16:21

标签: c++ stl ostringstream

几天前我遇到了一个微妙的错误,代码看起来像这样:

ostringstream ss;
int anInt( 7 );

ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();

问题是endsostringstream中贴了'\ 0',所以theWholeLot实际上看起来像"7HABITS\0"(即最后为空)< / p>

现在没有显示,因为theWholeLot被用于使用const char *获取string::c_str()部分这意味着null被掩盖,因为它只是一个分隔符。但是,当改变为使用整个字符串时,null突然意味着某些东西和比较,例如:

if ( theWholeLot == "7HABITS" )

会失败。这让我想到了:大概ends的原因是回归到ostrstream时,当流通常没有以null结尾时,必须是str()(然后不是string,而是char *)可以正常使用。

但是,现在无法从char *推出ostringstream,使用ends不仅是多余的,而是潜在的危险,我正在考虑将它们从我的客户代码。

任何人都可以看到在仅ends环境中使用std::string的明显原因吗?

2 个答案:

答案 0 :(得分:7)

你基本上回答了你自己的问题是需要的细节。当std::endsstd::string处理所有问题时,我当然无法想到使用std::stringstream的任何理由。

因此,要明确回答您的问题,不,没有理由在std::ends环境中使用std::string

答案 1 :(得分:6)

有些API期望带有多个零终止字符串的“字符串数组”,标记结尾的双零。 Raymond Chang就在最近blogged about it,最重要的是要证明这种情况经常被弄错。