特殊十六进制(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
相关产品推荐
相关产品推荐

