递归打印字符串所有子序列(含空串)报string subscript out of range错误求调试
问题根因分析
- 递归终止条件缺失返回语句:你的
process函数中,当i == str.size()触发终止条件时,仅执行了打印操作,没有添加return退出当前递归调用,程序会继续执行后续的下标访问逻辑 - 越界访问触发:此时
i已经等于字符串长度,C++字符串合法下标范围是0 ~ str.size()-1,执行sc1 += str[i]时直接访问了非法下标,就抛出了String subscript out of range报错
修复方案
只需要在终止条件的打印语句后添加return即可,修改后的完整代码如下:
#include<iostream> #include<string> using namespace std; #include<vector> class PrintSubstr { public: void printsubstr(string str) { string s; process(0, str,s); } void process(int i,string str,string s) { if (i==str.size()) { print(s); return; // 新增返回语句,终止当前递归分支 } // 选择当前字符的分支 string sc1 = s; sc1 += str[i]; process(i + 1, str,sc1); // 不选择当前字符的分支 string sc2 = s; process(i + 1, str, sc2); } void print(string s) { for (int i = 0; i < s.size(); i++) { cout << s[i] << ""; } cout << endl; } }; int main() { PrintSubstr p; string str("abc"); p.printsubstr(str); system("pause"); return 0; }
验证效果
输入abc时会按预期输出所有8个子序列(含空串):
c b bc a ac ab abc
(第一行空行对应空子序列)
内容的提问来源于stack exchange,提问作者Brown Sugar
相关产品推荐
相关产品推荐

