分段错误-尝试完成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){
                          ^^^^^^^^^^^^^^^^    ^^    ^^^