You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询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

问题原因

  1. 变量未初始化导致非法值:numberOFdigit函数中,num_of_digit变量在n != 0的分支下未初始化,其值为内存随机垃圾值。输入130时,循环会在该随机值基础上累加,最终返回一个远大于实际位数(3)的数值。
  2. 数组越界访问:main函数中num_dig数组大小固定为10,当num_of_digit返回的数值超过10时,for循环会访问数组下标超出范围的位置,触发段错误。
  3. 额外隐患:函数未处理负数输入,若输入负数,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:45:39