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

C语言十进制转任意进制代码字符串反转功能异常问题求解

代码存在的问题

  • 数组长度定义不合理:你用输入的十进制值作为temp和base数组的长度完全没有依据,比如十进制数10转二进制只需要4位,但如果输入的十进制值过大,会导致数组开得过大浪费空间,且C语言的可变长数组兼容性较差,建议直接定义足够容纳long类型最大进制转换结果的固定长度数组,比如开128位就足够覆盖所有常规场景。
  • 字符串缺少结束符:C语言中用%s输出的字符串必须以'\0'作为结尾标记,你当前的两个字符数组填充完有效字符后都没有手动添加结束符,输出时会读取数组后方内存中的垃圾值,导致结果异常。
  • 反转循环下标越界:第一个进制转换循环结束后,变量i的值是有效字符的总个数,比如转换后有3位有效字符,i的值为3,而temp数组的有效下标范围是0~2,你直接从i的当前值开始访问temp[i]属于数组越界,读取的是不确定的垃圾值。
  • 反转循环未加花括号:你写的反转for循环没有用{}包裹逻辑,只有base[j++] = temp[i--];这一行属于循环体,循环结束后才会执行两次printf语句,另外你同时输出未反转的temp数组本身也没有实际意义。
  • 未处理输入为0的边界情况:如果输入的十进制数是0,第一个转换循环不会执行,最终输出为空,不符合预期。

修正后代码

#include <stdio.h>
int main(){
    long decimal;
    int b = 0,i = 0,n,j = 0;
    // 定义足够大的固定长度数组,避免可变长数组兼容性问题
    char temp[128],base[128];
    printf("Enter Decimal Number :");
    scanf("%ld",&decimal);
    printf("Enter Base :");
    scanf("%d",&b);

    // 处理输入为0的特殊情况
    if(decimal == 0){
        temp[i++] = '0';
    }else{
        for(;decimal != 0;decimal /= b){
            n = decimal % b;
            if(n >= 0 && n <= 9)
                temp[i++] = n + '0'; // 用'0'代替魔术数48,可读性更好
            else
                temp[i++] = n -10 + 'A'; // 用'A'代替魔术数55,可读性更好
        }
    }
    // 给temp加字符串结束符
    temp[i] = '\0';

    // 反转逻辑,从i-1的有效下标开始遍历
    for(j = 0, i = i-1; i >= 0; i--,j++){
        base[j] = temp[i];
    }
    // 给base加字符串结束符
    base[j] = '\0';

    printf("反转前的temp内容 : %s\n",temp);
    printf("转换后的正确结果 : %s\n",base);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:04