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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:45:34