C++使用std::string.substr输出子串出现重复,原因是什么如何修正?
问题成因
- 你错误理解了
std::string::substr的参数定义:该函数第二个参数是子串的长度,而非子串的结束下标。当你传入的第二个参数值大于从起始下标开始能取到的最大字符数时,substr会自动截断到字符串末尾,这就导致不同的参数值返回了相同的子串。 - 以你提到的
cdefg重复为例:i=2时(对应起始字符是c),从下标2开始最多能取5个字符,此时当j等于7、6、5时,s.substr(2,j)都会被截断为长度5的cdefg,自然就出现了3次重复。
修复方案
调整内层循环逻辑,直接控制子串的长度从最大值(n-i,即从起始下标i到字符串末尾的总长度)递减到1即可,修改后的代码如下:
#include <iostream> #include <string> int main() { std::string s = "abcdefg"; int n = s.size(); for (int i = 0; i < n; i++) { // len为当前子串的长度,从最大可取值逐步减到1 for (int len = n - i; len >= 1; len--) { std::cout << s.substr(i, len) << std::endl; } } return 0; }
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

