我正在努力解决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;
}
};
};
}
答案 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)
for
中palindrome
循环的条件看起来不正确:
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++)
所以这是
x_str
内的无效索引。这就是你的段错的原因。您必须从length()-1
开始,然后使用i--
来使其正常运行。
未来:了解如何使用调试器。它将很容易向您显示发生分段错误或类似情况的代码行。如果你对编程很认真,那么无论如何,这是你需要掌握的技能。
例如,如果你在Linux上,你可以做到以下几点:
gdb your-program
(gdb) run
(gdb) bt
它会告诉你segfault发生的位置(如果使用调试符号编译而没有优化)。