Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大型递归字符串操作中的分段错误_C++_Linux_Gcc_Gdb - Fatal编程技术网

C++ 大型递归字符串操作中的分段错误

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

我正在做来自

我有一个代码,我认为它是有用的,我用C++来学习,同时玩得开心。 我正在做递归的字符串操作。 这里的问题是程序因分段错误而崩溃 在执行38次以上迭代时,在“char ch=line[0]”行上

#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));
  • 即使字符串为空,它也会从字符串中获取第一个字符

  • 它只是检查i是否与字符串的长度相同,而不是检查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));