2012-10-03 59 views
4

C++ STL函数substr(pos,n),pos的第一个参数据说具有此行为。从字符串末尾的位置开始返回子字符串(C++)

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

但是,如果我这样做

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

则不会抛出异常,即使POS = 2是定义过去字符串的结尾。

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

+1

没错。 's.substr(s.length(),666)'会返回'“”'而s.substr(s.length()+ 1,666)'会抛出异常。 – Prasanth

+0

但这怎么可能? s.length()是超过字符串末尾的位置,因此应根据上面的语句抛出异常异常。 – Slazer

+0

该报价从哪里来?充其量它是混乱。 –

回答

3

的实际要求是(§21.4.7.8):

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

在你的情况,POS ==大小(),所以你应该永远也看不到异常,并应始终得到一个空字符串。

+0

这是C++ 11的要求还是C++ 03/98的要求? –

+0

@NicolBolas:该引用来自C++ 11标准,但C++ 98/03具有相同的要求(只是不同的章节号:§21.3.6.7)。 –

+0

我刚刚跑过另一个说这个的线程。 '1需要:pos <= size() 2抛出:out_of_range如果pos> = size()' 我认为这可能是不同的标准吧? [http://stackoverflow.com/questions/12449298/what-is-the-complexity-of-stdstringsubstr-member-function] – Slazer

1

由于在作为第一个参数传递的位置的字符被包括在结果,位置2不应被认为是过去所述字符串的末尾:它是在字符串的末尾。字符串的长度是传递到substr的合法参数。