几天前我遇到了一个微妙的错误,代码看起来像这样:
ostringstream ss;
int anInt( 7 );
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
问题是ends
在ostringstream
中贴了'\ 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
的明显原因吗?
答案 0 :(得分:7)
你基本上回答了你自己的问题是需要的细节。当std::ends
和std::string
处理所有问题时,我当然无法想到使用std::stringstream
的任何理由。
因此,要明确回答您的问题,不,没有理由在std::ends
环境中使用std::string
。
答案 1 :(得分:6)
有些API期望带有多个零终止字符串的“字符串数组”,标记结尾的双零。 Raymond Chang就在最近blogged about it,最重要的是要证明这种情况经常被弄错。