大型递归字符串操作的段错误

时间:2015-12-24 01:42:28

标签: c++ linux gcc gdb

我正在接受来自www.adventofcode.com/day/10

的挑战

我有一个我觉得有效的代码,我正在使用c ++来学习,同时享受乐趣。

我正在进行字符串操作递归。 这里的问题是程序崩溃与分段错误 在线" char ch = line [0]"当进行超过38次迭代时。

#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;
}

使用以下代码编译代码:

g++ day10.cpp --std=c++11 -g

我的问题,为什么会发生这种情况,如何防止它,我如何使用gdb来解决这个问题?谢谢!

我正在使用linux和gcc 5.3

2 个答案:

答案 0 :(得分:1)

由于递归过深(数千个调用深度),您的堆栈溢出。您可以使用循环轻松实现算法。

答案 1 :(得分:0)

我怀疑访问可能不存在的字符串索引的任何代码行:

   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));
  1. 即使字符串为空,它也会抓取字符串中的第一个字符。

  2. 只检查i是否与字符串的长度相同 - 如果i大于字符串的长度则不行。