C++使用switch语句实现十进制转≥10进制代码错误排查咨询
问题修复说明
核心问题原因
- 类型不匹配导致输出异常:大于9的进制分支中,你将字符(如'A'/'C')的ASCII值存入
int类型的result数组,直接输出int值时会打印ASCII码的数字形式;同时余数小于10时你直接存储的是数值本身(如8),而非字符'8'对应的ASCII码,两类值拼接输出后就得到了你遇到的错误结果678('C'的ASCII值为67,数值8直接输出为8,拼接后即为678)。 - switch语句逻辑缺陷:
case 15分支遗漏了break关键字,余数为15时会出现潜在逻辑错误。 - 非标准语法兼容问题:代码中使用的可变长度数组
int result[cnt]不属于C++标准语法,仅部分编译器支持扩展实现,跨平台运行可能出错。
修复方案
修改点说明
- 将字符转换逻辑移到输出阶段执行,避免ASCII值存入int数组导致的输出异常,小于10的数值直接输出数字即可,无需额外转换
- 补全switch的
case 15分支的break语句,消除逻辑隐患 - 替换可变长度数组为标准动态数组实现,兼容所有C++编译器
- 新增动态数组内存释放逻辑,避免内存泄漏
修复后完整代码
#include <iostream> using namespace std; int main(){ int x,y,yCopy,r,cnt=0; cout << "Select a base for your number from 2 to 16 : "; cin >> x; cout << "Enter a decimal number in order to transform it to the selected base : " << endl; cin >> y; yCopy=y; // 计算转换后的结果位数 do{ yCopy=yCopy/x; cnt++; }while(yCopy!=0); yCopy=y; // 标准动态数组实现,替代非标准可变长度数组 int* result = new int[cnt]; if(x>1 && x<10){ for(int i=cnt-1; i>=0;--i){ r=yCopy%x; result[i]=r; yCopy=yCopy/x; } cout << y << "(10) = "; for(int i=0;i<cnt;++i){ cout << result[i]; } cout << "(" << x << ")" << endl; } if(x>9 && x<17){ for(int i=cnt-1; i>=0;--i){ r=yCopy%x; result[i]=r; yCopy=yCopy/x; } cout << y << "(10) = "; for(int i=0;i<cnt;++i){ int val = result[i]; switch(val){ case 10 : cout << 'A'; break; case 11 : cout << 'B'; break; case 12 : cout << 'C'; break; case 13 : cout << 'D'; break; case 14 : cout << 'E'; break; case 15 : cout << 'F'; break; // 补全break default: cout << val; // 小于10直接输出数字 } } cout << "(" << x << ")" << endl; } // 释放动态申请的内存 delete[] result; return 0; }
测试验证
输入进制16,十进制数200,运行后输出:200(10) = C8(16),符合预期结果。
内容的提问来源于stack exchange,提问作者Valzio
相关产品推荐
相关产品推荐

