14

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

ostringstream ss;
int anInt( 7 );

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

问题是ends'\0' 粘贴到实际看起来像这样ostringstream(即最后为空)theWholeLot"7HABITS\0"

现在这还没有出现,因为theWholeLot当时它被用来获取const char *部分,string::c_str()这意味着 null 被屏蔽了,因为它只是一个分隔符。然而,当它改为使用字符串时,null 突然意味着一些东西和比较,例如:

if ( theWholeLot == "7HABITS" )

会失败。这让我想到:大概的原因ends是回到ostrstream流通常不以 null 终止并且必须这样str()(然后抛出不是 astring而是 a char *)才能正常工作的日子。

但是,既然不可能从 a 中剔除 a char *,那么ostringstreamusingends不仅是多余的,而且有潜在的危险,我正在考虑将它们全部从我的客户代码中删除。

ends任何人都可以看到在std::string唯一环境中使用的明显理由吗?

4

2 回答 2

7

您基本上已经回答了您自己的问题,需要的细节也一样多。我当然想不出任何理由使用std::endswhenstd::stringstd::stringstream为您处理所有这些。

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

于 2010-02-26T00:11:03.587 回答
6

有一些 API 需要一个带有多个以零结尾的字符串的“字符串数组”,一个双零来标记结束。Raymond Chang 最近刚刚在博客上写了一篇关于它的文章,最重要的是要证明它经常被搞砸。

于 2010-02-26T02:37:19.533 回答