C ++ STL函数substr(pos,n),pos的第一个参数据说有这种行为。
“如果传递的位置超过字符串的结尾,则抛出out_of_range异常。”
但是,如果我做了类似
的事情string s("ab");
cout<<s.substr(2,666)<<endl;
然后,即使pos = 2超出了字符串的结尾,也没有抛出异常。
string :: end将“在字符串中的最后一个字符之后”的位置定义为“超过字符串结尾”。 我注意到返回的字符总是'\ 0'。我的问题是,如果这是标准行为,如果我可以指望在这种情况下返回一个空字符串的事实。谢谢。
答案 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
的合法参数。