八进制转二进制代码出现段错误,如何不转十进制重构?
八进制转二进制代码段错误修复(不中转十进制)
原代码运行时触发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]); } }
问题分析
- 循环变量冲突:内外层循环共用
i,导致外层循环的i被内层循环覆盖,后续数组访问索引完全混乱,直接引发越界访问 - 数组索引逻辑错误:
b[i+1]的赋值方式轻易超出数组b[10]的边界,触发段错误 - 反向循环条件错误:最后一个循环的
i<=0逻辑完全错误,应该是i>=0,否则循环根本不会执行 - 转换逻辑错误:八进制每一位对应固定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
相关产品推荐
相关产品推荐

