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

八进制转二进制代码出现段错误,如何不转十进制重构?

八进制转二进制代码段错误修复(不中转十进制)

原代码运行时触发segmentation fault(段错误),要求在不通过十进制中转的前提下重构代码解决问题。

错误代码

void octbin()
{   
    int i,o,a,r,b[10],j=0;
    printf("octal: ");
    scanf("%d",&o);
    for(i=0;o>0;i++)
    {   
        r=o%10;
        
        for(i=0;r>0;i++)
        {  
            printf("hehe");
            a=r%2;
            (r==0)?b[i+1]=0:(b[i]=a);
            r/=2;
            
        }
        o/=10;
        printf("%d",b[i]);
    }
    for (i=i-1;i<=0;i--)
    {
        printf("%d",b[i]);
    }
}

问题分析

  1. 循环变量冲突:内外层循环共用i,导致外层循环的i被内层循环覆盖,后续数组访问索引完全混乱,直接引发越界访问
  2. 数组索引逻辑错误:b[i+1]的赋值方式轻易超出数组b[10]的边界,触发段错误
  3. 反向循环条件错误:最后一个循环的i<=0逻辑完全错误,应该是i>=0,否则循环根本不会执行
  4. 转换逻辑错误:八进制每一位对应固定3位二进制,原代码未遵循这个规则,混乱处理单个数字的二进制位,输出结果不符合预期

修复后的代码

void octbin()
{
    int oct;
    printf("octal: ");
    scanf("%d", &oct);

    // 每个八进制位对应3位二进制,定义足够大的数组存储结果
    int bin[24];
    int bin_idx = 0;

    while (oct > 0)
    {
        int digit = oct % 10;
        // 单个八进制位转3位二进制,从低位到高位存入数组
        for (int i = 0; i < 3; i++)
        {
            bin[bin_idx++] = digit % 2;
            digit /= 2;
        }
        oct /= 10;
    }

    // 逆序输出(因为存储时是从二进制低位开始存的)
    printf("binary: ");
    for (int i = bin_idx - 1; i >= 0; i--)
    {
        printf("%d", bin[i]);
    }
    printf("\n");
}

修复思路

  • 拆分循环变量:内外层循环使用不同变量,避免变量覆盖导致的逻辑混乱
  • 遵循转换规则:每个八进制位固定转换为3位二进制,保证输出格式正确
  • 合理规划数组大小:按最大可能的二进制位数定义数组,彻底避免越界问题
  • 逆序输出:由于处理时从八进制低位开始,存储的二进制位是低位在前,逆序输出才能得到正确的高位到低位的二进制结果

内容的提问来源于stack exchange,提问作者user27643234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:39:57