C++进制转换程序问题:高进制下输出ASCII值而非对应字母
解决C++进制转换中高进制字母输出ASCII值的问题
你的核心问题确实是数组x的类型导致的:当你把'A'这类字符赋值给int变量时,存的是它的ASCII码(比如'A'对应65),直接输出int就会打印数字而非字符。结合代码里的其他小bug,以下是完整修复方案:
关键修改点
- 数组类型调整:把存储转换结果的数组从
int改为char,直接存储字符而非ASCII码值,输出时自然显示字母。 - 修复switch逻辑:原代码里
switch(char(rem))是错误的——rem是10-15,转成char对应不可见控制字符,根本匹配不到case 10等分支,应该直接用switch(rem)判断数值。 - 替换非标准变长数组:C++不支持
int x[i]这种变长数组(VLA),换成固定大小的char x[80]更规范。 - 移除无用参数:
base函数的n和t参数是传值的,且函数内部会重新输入赋值,完全可以去掉这些参数简化代码。
修复后的完整代码
#include <iostream> using namespace std; void base(); int main() { char ch; do { base(); cout << "\n\nDo you want to continue?(y/n)"; cin >> ch; } while (ch == 'y' || ch == 'Y'); return 0; } void base() { int n = 0, t = 0; cout << "\nPlease enter the number : "; cin >> n; cout << "\nPlease enter the base : "; cin >> t; char x[80]; int m = n; int i = 1; for (; n >= t; i++) { int rem = n % t; n = n / t; if (rem > 9) { switch (rem) { case 10 : x[i] = 'A'; break; case 11 : x[i] = 'B'; break; case 12 : x[i] = 'C'; break; case 13 : x[i] = 'D'; break; case 14 : x[i] = 'E'; break; case 15 : x[i] = 'F'; break; default: x[i] = '?'; break; } } else { x[i] = '0' + rem; } } cout << "The number " << m << " in base " << t << " is = "; cout << (n > 9 ? ('A' + n - 10) : ('0' + n)); for (int j = i - 1; j > 0; j--) cout << x[j]; cout << endl; }
额外优化说明
- 增加了大写
Y的判断,提升用户体验; - 最高位的输出也做了数字/字母转换,避免原代码中最高位如果是>9的数直接输出数字的问题;
- 加入
default分支处理超出15的余数(比如进制>16时),避免未定义行为; - 把数字0-9转字符的逻辑统一用
'0' + rem,写法更简洁。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

