分段错误 - 试图完成Euler 4

时间:2014-05-09 14:01:26

标签: c++ segmentation-fault

我正在努力解决C ++中的Euler问题(作为一种学习工具),我问题4,如何找到两个三位整数的最大回文产品。但是,当我运行程序时,我收到错误Segmentation fault (core dumped)。我不知道我做了什么导致这个,有人可以向我解释一下吗?

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

bool palindrome(int x){
    string x_str = to_string(x);
    string x_str_rev = "";
    for(unsigned int i = x_str.length(); i > 0; i++){
        x_str_rev += x_str[i];
    };
    if(x_str == x_str_rev){
        return true;
    }
    else{
        return false;
    };
}

int main(){
    for(int i = 999; i > 100; i--){
        for(int x = 999; x > 100; x--){
            if(palindrome(i * x)){
                cout << i * x << endl;
                return 0;
            }
        };
    };
}

4 个答案:

答案 0 :(得分:2)

for(unsigned int i = x_str.length(); i > 0; i++)

这就是问题所在。

查看执行此循环时变量i会发生什么。尝试一步一步地运行它。

for(unsigned int i = x_str.length(); i > 0; i++){
    std::cerr << "i =" << i << std::endl;
    x_str_rev += x_str[i];
};

学习发现索引问题是解决此类段错误问题的重要部分。

答案 1 :(得分:2)

forpalindrome循环的条件看起来不正确:

for(unsigned int i = x_str.length(); i > 0; i++){
    x_str_rev += x_str[i];
};

我希望你的意思是向后冲过正确的字符串吗?您在上面的代码片段中所做的是从字符串的末尾开始,然后进入无人区,这将导致未定义的行为。

你应该使用这样的递减循环:

for(unsigned int i = x_str.length() - 1; i >= 0; --i){
    x_str_rev += x_str[i];
};

答案 2 :(得分:2)

更改

for (unsigned int i = x_str.length(); i > 0; i++){

for (unsigned int i = x_str.length()-1; i >= 0; --i){
                      ^^^^^^^^^^^^^^^^    ^^    ^^^

答案 3 :(得分:1)

你有一个循环遍历字符串中的字符。但是你递增 i而不是递减:

for(unsigned int i = x_str.length(); i > 0; i++)

所以这是

  1. 无限循环
  2. 访问x_str内的无效索引。这就是你的段错的原因。
  3. 您必须从length()-1开始,然后使用i--来使其正常运行。

    未来:了解如何使用调试器。它将很容易向您显示发生分段错误或类似情况的代码行。如果你对编程很认真,那么无论如何,这是你需要掌握的技能。

    例如,如果你在Linux上,你可以做到以下几点:

    gdb your-program
    (gdb) run 
    (gdb) bt
    

    它会告诉你segfault发生的位置(如果使用调试符号编译而没有优化)。