分段错误-尝试完成Euler 4 我试图通过C++中的Euler问题(作为学习工具)来研究,我要问4个问题,如何找到最大的23位整数的回文积。然而,当我运行我的程序时,我得到了错误分段错误(内核转储)。我不知道我做了什么导致了这一切,有人能给我解释一下吗
这是我的密码:分段错误-尝试完成Euler 4 我试图通过C++中的Euler问题(作为学习工具)来研究,我要问4个问题,如何找到最大的23位整数的回文积。然而,当我运行我的程序时,我得到了错误分段错误(内核转储)。我不知道我做了什么导致了这一切,有人能给我解释一下吗,c++,segmentation-fault,C++,Segmentation Fault,这是我的密码: #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
#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;
}
};
};
}
#包括
#包括
使用名称空间std;
布尔回文(int x){
字符串x_str=to_字符串(x);
字符串x_str_rev=“”;
对于(无符号整数i=x_str.length();i>0;i++){
x_str_rev+=x_str[i];
};
如果(x_str==x_str_rev){
返回true;
}
否则{
返回false;
};
}
int main(){
对于(int i=999;i>100;i--){
对于(int x=999;x>100;x--){
if(回文(i*x)){
库特
这就是问题所在
查看执行此循环时变量i
会发生什么情况。尝试一步一步地运行它
for(unsigned int i = x_str.length(); i > 0; i++){
std::cerr << "i =" << i << std::endl;
x_str_rev += x_str[i];
};
for(unsigned int i=x_str.length();i>0;i++){
std::cerr您有一个循环,循环遍历字符串中的字符。但是您增加i
,而不是减少:
for(unsigned int i = x_str.length(); i > 0; i++)
所以这是
无限循环
访问x_str
中的无效索引。这就是您的错误原因
您必须从length()-1
开始,然后使用i--
来让它工作
未来:学习如何使用调试器。调试器将随时向您显示发生分段错误或类似错误的代码行。如果您对编程很认真,这是您需要掌握的技能
例如,如果您的计算机在Linux上运行,您可以执行以下操作:
gdb your-program
(gdb) run
(gdb) bt
它会向您显示SEGFULT发生的位置(如果使用调试符号编译且未进行优化)。回文中循环的标准看起来不正确:
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];
};
改变
到
使用gdbSee运行程序“我不确定我做了什么导致了这一点”-您编写了错误代码,期望其他人不必亲自尝试就可以修复它,因此-1和投票结果接近。
for(unsigned int i = x_str.length() - 1; i >= 0; --i){
x_str_rev += x_str[i];
};
for (unsigned int i = x_str.length(); i > 0; i++){
for (unsigned int i = x_str.length()-1; i >= 0; --i){
^^^^^^^^^^^^^^^^ ^^ ^^^