咨询C++提取整数数位时出现Segmentation Fault的解决方法
提取整数各位数字触发段错误的问题解决
问题描述
编写了一段C++代码,目的是提取输入整数的各位数字并存入数组,但在Programmiz在线编译器中输入130时触发Segmentation Fault(段错误),需要排查原因并解决。
原代码
#include <iostream> #include <iomanip> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //functions int numberOFdigit (int n){ int num_of_digit; if (n==0) num_of_digit=1; else{ while (n>0){ n/=10; num_of_digit+=1; } } return num_of_digit; } int main(int argc, char** argv) { int number; cout<<"Input an integer: "; cin>>number; int num_of_digit=numberOFdigit (number); int num_dig[10]; int backup=number; int number_backup=number; for (int i=num_of_digit-1;i>=0;--i){ int digit_=backup%10; num_dig[i] = digit_; backup/=10; } return 0; }
报错情况
Input an integer: 130 Segmentation fault
问题原因
- 变量未初始化导致非法值:
numberOFdigit函数中,num_of_digit变量在n != 0的分支下未初始化,其值为内存随机垃圾值。输入130时,循环会在该随机值基础上累加,最终返回一个远大于实际位数(3)的数值。 - 数组越界访问:
main函数中num_dig数组大小固定为10,当num_of_digit返回的数值超过10时,for循环会访问数组下标超出范围的位置,触发段错误。 - 额外隐患:函数未处理负数输入,若输入负数,
n>0的循环不会执行,返回的num_of_digit依然是未初始化的垃圾值。
修复方案
- 在
numberOFdigit函数中初始化num_of_digit为0; - 处理负数输入,先将输入值转为绝对值再计算位数;
- 可选:改用
vector<int>动态数组,避免固定大小数组的范围限制。
修复后的代码
#include <iostream> #include <cstdlib> // 用于abs函数处理负数 using namespace std; int numberOFdigit(int n) { if (n == 0) { return 1; } int num_of_digit = 0; n = abs(n); // 统一处理正负整数 while (n > 0) { n /= 10; num_of_digit += 1; } return num_of_digit; } int main(int argc, char** argv) { int number; cout << "Input an integer: "; cin >> number; int num_of_digit = numberOFdigit(number); // 若需支持更多位数,建议替换为vector<int> num_dig(num_of_digit); int num_dig[10]; int backup = abs(number); // 负数取绝对值后再提取各位 for (int i = num_of_digit - 1; i >= 0; --i) { int digit_ = backup % 10; num_dig[i] = digit_; backup /= 10; } // 可选:打印验证提取结果 cout << "提取的各位数字:"; for (int i = 0; i < num_of_digit; ++i) { cout << num_dig[i] << " "; } cout << endl; return 0; }
内容的提问来源于stack exchange,提问作者KiuSandy
相关产品推荐
相关产品推荐

