C++ string substr方法行为疑惑:输出为何与预期不符?
关于C++ string::substr方法的行为解释
你的问题核心是搞错了substr的参数定义:它的第二个参数是要提取的字符长度,不是结束位置的索引。
先看你的测试代码:
string A = "LOLWUT"; cout << A.substr(0, A.length() - 1) << endl; cout << A.substr(1, A.length() - 1) << endl;
字符串A的长度是6,我们逐行分析:
第一行调用
A.substr(0, 6-1):
从索引0开始,提取5个字符,得到LOLWU,这和实际输出、你的预期都一致。第二行调用
A.substr(1, 6-1):
从索引1开始,提取5个字符。原字符串索引1的字符是O,往后数5个字符分别是O、L、W、U、T,所以输出OLWUT——这就是实际结果的由来。
你预期输出OLWU,是误以为第二个参数是结束索引(比如想取到索引4),但实际上要得到4个字符,应该把第二个参数设为A.length()-2(也就是4),写法是:
cout << A.substr(1, A.length() - 2) << endl;
这样从索引1开始取4个字符,就能得到OLWU。
另外补充:如果substr的第二个参数超过了起始位置到字符串末尾的剩余字符数,函数会自动取到字符串末尾,但你的情况里,从索引1到末尾正好有5个字符,所以全部被提取了。
内容的提问来源于stack exchange,提问作者Carrot13
相关产品推荐
相关产品推荐

