C++ 大型递归字符串操作中的分段错误
我正在做来自 我有一个代码,我认为它是有用的,我用C++来学习,同时玩得开心。 我正在做递归的字符串操作。 这里的问题是程序因分段错误而崩溃 在执行38次以上迭代时,在“char ch=line[0]”行上C++ 大型递归字符串操作中的分段错误,c++,linux,gcc,gdb,C++,Linux,Gcc,Gdb,我正在做来自 我有一个代码,我认为它是有用的,我用C++来学习,同时玩得开心。 我正在做递归的字符串操作。 这里的问题是程序因分段错误而崩溃 在执行38次以上迭代时,在“char ch=line[0]”行上 #include <iostream> #include <string> using namespace std; string count_chars(string line){ char ch = line[0]; uint i; f
#include <iostream>
#include <string>
using namespace std;
string count_chars(string line){
char ch = line[0];
uint i;
for(i = 0; ch == line[i]; i++){
}
if(i != line.length()){
line = to_string(i) + ch + count_chars(line.substr(i));
}
else{
line = to_string(i) + ch;
}
return line;
}
int main(int argc, char** args)
{
//ifstream in("dayx");
/*
if(argc ==1)
return 1;
string line;
cout << line.capacity() << endl;
line = args[1];
*/
string line = "1";
for(int i = 1; i < 40; i++){
line = count_chars(line);
//cout << line << " after " << i << " iterations" << endl;
cout <<"Line size: " << line.size() << endl;
}
cout << line << endl;
}
我的问题是,为什么会发生这种情况,我如何防止它,我如何使用gdb来解决这个问题?谢谢
我正在使用linux和gcc 5.3,我怀疑有任何代码行访问可能不存在的字符串索引:
char ch = line[0];
uint i;
for(i = 0; ch == line[i]; i++){
}
if(i != line.length()){
line = to_string(i) + ch + count_chars(line.substr(i));
由于递归太深(几千次调用都很深),所以堆栈溢出。您可以使用循环来轻松实现该算法。谢谢您的输入,这似乎是一个很好的实践,值得思考。这不是本例中的问题。你知道我如何使用调试器来获取这些信息吗?gdb是一个功能强大但不太友好的程序。@Kristofer type
bt
当你的程序崩溃时,你会看到调用堆栈
char ch = line[0];
uint i;
for(i = 0; ch == line[i]; i++){
}
if(i != line.length()){
line = to_string(i) + ch + count_chars(line.substr(i));