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 回答