我正在接受来自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
答案 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));
即使字符串为空,它也会抓取字符串中的第一个字符。
只检查i是否与字符串的长度相同 - 如果i大于字符串的长度则不行。