返回从字符串末尾开始的位置开始的子串(C ++)

时间:2012-10-03 01:10:50

标签: c++ substr

C ++ STL函数substr(pos,n),pos的第一个参数据说有这种行为。

  

“如果传递的位置超过字符串的结尾,则抛出out_of_range异常。”

但是,如果我做了类似

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

然后,即使pos = 2超出了字符串的结尾,也没有抛出异常。

string :: end将“在字符串中的最后一个字符之后”的位置定义为“超过字符串结尾”。 我注意到返回的字符总是'\ 0'。我的问题是,如果这是标准行为,如果我可以指望在这种情况下返回一个空字符串的事实。谢谢。

2 个答案:

答案 0 :(得分:3)

实际要求是(§21.4.7.8):

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

在你的情况下,pos == size(),所以你永远不应该看到异常,并且应该总是得到一个空字符串。

答案 1 :(得分:1)

由于作为第一个参数传递的位置处的字符包含在结果中,因此位置2不应被视为过去字符串的结尾:它是 at 字符串的结尾。字符串的长度是传递给substr的合法参数。