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

特殊十六进制(U-Z替代A-F)与十进制互转代码故障排查求助

特殊十六进制(U-Z替代A-F)与十进制互转代码问题排查

这里使用的十六进制系统较为特殊,以U-Z替代常规的A-F。以下是本人编写的C语言代码,用于实现该特殊十六进制与十进制的互转,自测无问题,但学校在线评测系统显示部分测试用例失败,恳请提供排查帮助。

#include<stdio.h>

int main() {

    // Write your program logic here. This line is a comment, you can leave it in code if you wish.
    // conversion of hexadecimal to decimal.
    
    //1.taking user input of string
    char hexaDec[10];
    int counter = 0;
    for(int i = 0; i<10; i++){
        scanf("%c", &hexaDec[i]);
        if(i<=8){
            if(hexaDec[i] == '\n'){
                hexaDec[i+1] = '\0';
                break;
            }
        }
        counter++;
    }
    // hexaDec[10] = '\0'; wasn't sure if this was required
    
    int dnum = 0;
    scanf("%d", &dnum);
    
    int decimalC = 0;
    int product = 1;
    while(counter>0){
        char cnum = hexaDec[counter-1];
        
        int check = cnum - 'U';
        if(cnum - '0' >= 0 && cnum - '0' <= 9){
            decimalC = decimalC + (cnum - '0') * product;
        }
        else if(check >=0 && check <= 5) {
            decimalC = decimalC + (check + 10)*product;
        }
        
        product = product*16;
        counter--;
    }
    printf("%d\n", decimalC);
    
    // //decimal to hexadecimal
    
    char decimalH[10];
    int count = 0;
    if(dnum>0){
        for(count =0; dnum>0  && count<=10; count++){
            int rem = dnum%16;
            dnum = dnum/16;
            if(rem>=0 && rem<=9){
                decimalH[count] = rem +'0';
            }
            else if(rem>=10 && rem<=15){
                decimalH[count] = rem -10 + 'U';
            }
        }        
    }
    
    else if(dnum == 0){
        printf("%c", '0');
    }
    
    while(count>0){
        printf("%c", decimalH[count-1]);
        count--;
    }
    printf("%c", '\0');
    return 0;
}

可能的问题点及修复建议:

  • 输入读取逻辑错误:

    • 使用scanf("%c")读取十六进制字符时,不会自动跳过空白字符(比如换行、空格),如果用户输入完十六进制字符串后按回车,后续的scanf("%d")可能读取到错误的输入,同时十六进制字符串数组可能会包含换行符,导致转换错误。建议修改为scanf(" %c", &hexaDec[i])(注意%c前的空格),跳过所有空白字符后再读取有效字符。
    • 当遇到换行符时,counter的计算有误:比如输入"U"后回车,i=0读取到'U',counter变为1;i=1读取到'\n',此时设置hexaDec[2]='\0'并break,但counter已经是2,后续处理会读取hexaDec[1](即'\n'),这会被忽略,导致转换结果错误。应该在遇到'\n'时,不将当前i计入counter,直接设置hexaDec[i]='\0'并break,同时counter=i。
  • 负数处理缺失:

    • 代码中dnum是int类型,scanf("%d")会读取负数,但十进制转十六进制部分只处理了dnum>0和dnum==0的情况,完全没有处理负数场景,这会导致负数测试用例直接失败。需要补充负数的处理逻辑(比如先取绝对值,转换后添加负号)。
  • 整数溢出问题:

    • 十六进制转十进制时,decimalC和product都是int类型,当十六进制字符串较长时(比如8位以上),product*16会超出int的范围(通常为-231到231-1),导致溢出,计算结果错误。建议将decimalC和product改为long long类型,避免溢出。
  • 多余输出字符:

    • 代码最后一行printf("%c", '\0')会输出一个空字符,虽然终端不可见,但评测系统可能会检测输出内容的完整性,这会导致输出不符合预期,应该删除这行代码。
  • 数组越界风险:

    • 十进制转十六进制的循环条件是count<=10,但decimalH数组长度为10,下标范围是0-9,当count=10时会访问decimalH[10],导致数组越界,行为未定义。应将循环条件改为count<10。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:43:19