4

C ++ STL関数substr(pos、n)の最初のパラメーターposは、この動作をしていると言われています。

「渡された位置が文字列の終わりを超えている場合、out_of_range例外がスローされます。」

しかし、私が次のようなことをすると

string s("ab");
cout<<s.substr(2,666)<<endl;

その場合、pos = 2が定義上文字列の終わりを超えていても、例外はスローされません。

string :: endは、「文字列の最後の文字の後」の位置を「文字列の終わりを過ぎた」と定義します。返される文字は常に「\0」であることに気づきました。私の質問は、これが標準の動作であるかどうか、そしてこの場合は空の文字列が返されるという事実を信頼できるかどうかです。ありがとうございました。

4

2 に答える 2

3

実際の要件は次のとおりです (§21.4.7.8):

1 Requires: pos <= size()
2 Throws: out_of_range if pos > size().

あなたの場合、pos == size() であるため、例外が発生することはなく、常に空の文字列を取得する必要があります。

于 2012-10-03T01:18:39.827 に答える
1

最初のパラメーターとして渡された位置の文字が結果に含まれるため、位置は文字列の末尾を超え2ていると見なされるべきではありません: 文字列の末尾にあります。文字列の長さは、 に渡す正当な引数です。substr

于 2012-10-03T01:18:48.467 に答える