14

数日前、コードが次のような微妙なバグに遭遇しました。

ostringstream ss;
int anInt( 7 );

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

問題は、endsが '\0' を に貼り付けていたostringstreamため、theWholeLot実際には次のように見えたことです"7HABITS\0"(つまり、最後に null が表示されます)。

を使用して部分をtheWholeLot取得するために使用されていたため、これは表示されませんでした。これは、ヌルが単なる区切り文字になったため、マスクされたことを意味します。ただし、これが文字列を使用するように変更されたとき、null は突然何かを意味し、次のような比較が行われました。const char *string::c_str()

if ( theWholeLot == "7HABITS" )

失敗するでしょう。これは私に考えさせました:おそらく理由は、ストリームが通常はnullで終了せず、(その後、 a ではなく a をキャストする)が正しく機能するようにする必要があっendsた時代への逆戻りです。ostrstreamstr()stringchar *

ただし、 achar *から aをキャストすることができないためostringstream、使用endsは不要であるだけでなく、潜在的に危険であり、クライアント コードからすべて削除することを検討しています。

唯一の環境で使用endsする明白な理由を誰でも見ることができますか?std::string

4

2 に答える 2

7

あなたは基本的にあなた自身の質問に答えましたが、必要な詳細です。std::endswhenstd::stringを使用してそれらすべてを処理する理由はまったく思いつきませstd::stringstreamん。

したがって、質問に明確に答えるために、いいえ、唯一の環境で使用std::endsする理由はありません。std::string

于 2010-02-26T00:11:03.587 に答える
6

複数のゼロで終了する文字列、終了を示す二重のゼロを持つ「文字列配列」を期待するAPIがいくつかあります。レイモンド・チャンは最近それについてブログを書きました、何よりもこれがどれほど頻繁に失敗するかを示すために。

于 2010-02-26T02:37:19.533 に答える