调试程序。如果您不知道,GMP附带C++(GMPXX)。这样可以避免弄乱mpz_*函数。那么我应该怎么做?我应该用什么替换它?你需要思考。阅读。不要期望其他人纠正你的错误。哦,我明白了!不用加法,只需乘以10+1;所以1*10+1=11;11*10+1=111!,c++,gmp,C++,Gmp" /> 调试程序。如果您不知道,GMP附带C++(GMPXX)。这样可以避免弄乱mpz_*函数。那么我应该怎么做?我应该用什么替换它?你需要思考。阅读。不要期望其他人纠正你的错误。哦,我明白了!不用加法,只需乘以10+1;所以1*10+1=11;11*10+1=111!,c++,gmp,C++,Gmp" />

使用GMP整数时出现分段错误(堆芯转储) 我用C++编写了一个简单的程序,用GMP库打印出数字的模数,它的数字由1(如1, 11, 111,1111, 11111,…)和2001组成;问题是,当程序达到1的23位数字时,我会得到一个错误,称为Segmantation fault(内核转储)。你能指出问题出在哪里吗?这是我的密码: #include <iostream> #include <stdio.h> #include <string> #include <gmpxx.h> int main(int argc, char** args){ mpz_t currNumber; mpz_init(currNumber); mpz_set_str(currNumber, "1", 10); while(mpz_sizeinbase(currNumber, 10) < 24){ char* digits = mpz_get_str(nullptr, 10, currNumber); strcat(digits, "1"); mpz_set_str(currNumber, digits, 10); digits = nullptr; mpz_t r; mpz_init(r); mpz_set_str(r, "1", 20); mpz_t divisor; mpz_init(divisor); mpz_set_str(divisor, "2001", 20); mpz_mmod(r, currNumber, divisor); std::cout << "====>" << currNumber << " mod(2001) = " << r << "\n\n\n"; //Clean up mpz_clear(r); mpz_clear(divisor); } std::cout << "Went until " << mpz_sizeinbase(currNumber, 10) << " digits !" << "\n"; ///Clean up mpz_clear(currNumber); return 0; } #包括 #包括 #包括 #包括 int main(int argc,char**args){ mpz_t电流编号; mpz_初始值(当前编号); mpz_集_街(货币编号,“1”,10); 而(货币数量,10)我的代码是否有效?为什么我需要编译它?2)它是否有漏洞?从编译器获得警告,并能够使用 GDB < /C>调试程序。如果您不知道,GMP附带C++(GMPXX)。这样可以避免弄乱mpz_*函数。那么我应该怎么做?我应该用什么替换它?你需要思考。阅读。不要期望其他人纠正你的错误。哦,我明白了!不用加法,只需乘以10+1;所以1*10+1=11;11*10+1=111!

使用GMP整数时出现分段错误(堆芯转储) 我用C++编写了一个简单的程序,用GMP库打印出数字的模数,它的数字由1(如1, 11, 111,1111, 11111,…)和2001组成;问题是,当程序达到1的23位数字时,我会得到一个错误,称为Segmantation fault(内核转储)。你能指出问题出在哪里吗?这是我的密码: #include <iostream> #include <stdio.h> #include <string> #include <gmpxx.h> int main(int argc, char** args){ mpz_t currNumber; mpz_init(currNumber); mpz_set_str(currNumber, "1", 10); while(mpz_sizeinbase(currNumber, 10) < 24){ char* digits = mpz_get_str(nullptr, 10, currNumber); strcat(digits, "1"); mpz_set_str(currNumber, digits, 10); digits = nullptr; mpz_t r; mpz_init(r); mpz_set_str(r, "1", 20); mpz_t divisor; mpz_init(divisor); mpz_set_str(divisor, "2001", 20); mpz_mmod(r, currNumber, divisor); std::cout << "====>" << currNumber << " mod(2001) = " << r << "\n\n\n"; //Clean up mpz_clear(r); mpz_clear(divisor); } std::cout << "Went until " << mpz_sizeinbase(currNumber, 10) << " digits !" << "\n"; ///Clean up mpz_clear(currNumber); return 0; } #包括 #包括 #包括 #包括 int main(int argc,char**args){ mpz_t电流编号; mpz_初始值(当前编号); mpz_集_街(货币编号,“1”,10); 而(货币数量,10)我的代码是否有效?为什么我需要编译它?2)它是否有漏洞?从编译器获得警告,并能够使用 GDB < /C>调试程序。如果您不知道,GMP附带C++(GMPXX)。这样可以避免弄乱mpz_*函数。那么我应该怎么做?我应该用什么替换它?你需要思考。阅读。不要期望其他人纠正你的错误。哦,我明白了!不用加法,只需乘以10+1;所以1*10+1=11;11*10+1=111!,c++,gmp,C++,Gmp,第一个明显的错误是: char* digits = mpz_get_str(nullptr, 10, currNumber); strcat(digits, "1"); mpz_get_str分配的缓冲区没有足够的空间让您将一个额外字符连接到其内容上 我想你可以用: char* digits = mpz_get_str(nullptr, 10, currNumber); std::string more_digits = std::string(digits

第一个明显的错误是:

    char* digits =  mpz_get_str(nullptr, 10, currNumber);
    strcat(digits, "1");
mpz_get_str分配的缓冲区没有足够的空间让您将一个额外字符连接到其内容上

我想你可以用:

    char* digits =  mpz_get_str(nullptr, 10, currNumber);
    std::string more_digits = std::string(digits) + "1";
    free(digits);
    mpz_set_str(currNumber, more_digits.c_str(), 10);

1)由于您在C++中,所以您应该使用STD::String用于大多数字符串操作,不需要了解使用C字符串的晦涩。


2) 如果我正确理解mpz_get_str(尽管我自己从未使用过它),您需要释放它分配的缓冲区(正如我在建议的代码中所做的那样)以避免内存泄漏。

否,您需要使用所有警告和调试信息进行编译(
g++-Wall-Wextra-g
)使用<代码> GDB < /Cord>我的代码是否有效?为什么我需要编译它?2)它是否有漏洞?从编译器获得警告,并能够使用<代码> GDB < /C>调试程序。如果您不知道,GMP附带C++(GMPXX)。这样可以避免弄乱mpz_*函数。那么我应该怎么做?我应该用什么替换它?你需要思考。阅读。不要期望其他人纠正你的错误。哦,我明白了!不用加法,只需乘以10+1;所以1*10+1=11;11*10+1=111!