You need to enable JavaScript to run this app. C++ 手动实现十六进制转十进制转换器:支持自定义输入、禁用内置转换、不用string
优惠活动
大模型
产品
解决方案
定价
更多

C++ 手动实现十六进制转十进制转换器:支持自定义输入、禁用内置转换、不用string

需求与约束说明

需要开发支持自定义输入个数的十六进制转十进制转换器:用户先指定要转换的十六进制数总个数,程序依次读取对应数量的十六进制数,逐个完成转换并输出十进制结果。
必须遵守的开发约束:

  • 手动实现全部转换逻辑,不得调用现成的十六进制转十进制内置函数
  • 仅允许使用iostream、cstring、cmath三个标准库
  • 禁止使用string类型存储输入的十六进制内容,必须用char类型(如char数组)存储

原代码问题排查

  • 输入存储逻辑完全失效:申请的一维char数组长度和用户指定的转换个数一致,每次循环仅读取单个字符存入数组元素,根本无法容纳多位十六进制数(例如输入A3这类两位十六进制数,会被拆成两个独立字符拆分存储)。
  • 数组越界与未定义行为:循环内定义的char idk[10000]为未初始化的栈数组,直接给下标10000的位置赋值(超出数组0~9999的有效下标范围),随后直接将未初始化的数组传入strlen计算长度,读取的全是栈上的随机垃圾值。
  • 循环变量书写错误:内层转换循环将循环条件写为i < duljina,增量也错用了外层循环的i++,正确逻辑应该是遍历当前字符串下标的j做增量,该错误会直接打乱外层计数,导致循环逻辑彻底混乱。
  • 字符转数值逻辑缺失:仅实现了A-F/a-f的字符值转换,完全没有覆盖0-9的数字字符——数字字符的ASCII编码和实际数值不相等,直接参与乘法计算会得到错误结果。
  • 权重计算偏移:十六进制位的权重从右往左依次为160、161...,原代码初始设置的权重指数等于字符串长度,相当于最左侧的位多乘了一次16,正确的初始指数应为字符串长度减1。
  • 内存泄漏:用new申请的堆内存没有对应delete释放。
  • 浮点精度隐患:直接将pow返回的浮点值强转为整数,幂次较高时可能因浮点存储误差出现结果偏差,需要做精度修正。

符合全部约束的可运行实现

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
    int numCount;
    // 校验输入的个数合法性,不能小于1
    do
    {
        cout << "请输入要转换的十六进制数总个数:";
        cin >> numCount;
    } while (numCount < 1);

    // 申请二维char数组存储输入:每个数分配长度100的char数组,足够容纳长十六进制数
    char (*hexInputs)[100] = new char[numCount][100];
    // 循环读取每个十六进制输入
    for (int i = 0; i < numCount; i++)
    {
        cout << "请输入第" << i + 1 << "个十六进制数:";
        cin >> hexInputs[i]; // 自动以'\0'结尾形成C风格字符串,符合char类型存储要求
    }

    // 逐个完成转换并输出结果
    for (int i = 0; i < numCount; i++)
    {
        int decResult = 0;
        int strLen = strlen(hexInputs[i]); // 调用cstring库的strlen计算字符串长度
        // 逐位计算十进制值,全程手动实现转换逻辑
        for (int j = 0; j < strLen; j++)
        {
            char currentChar = hexInputs[i][j];
            int charValue = 0;
            // 手动将字符映射为对应数值,不调用内置转换接口
            if (currentChar >= '0' && currentChar <= '9')
            {
                charValue = currentChar - '0';
            }
            else if (currentChar >= 'A' && currentChar <= 'F')
            {
                charValue = currentChar - 'A' + 10;
            }
            else if (currentChar >= 'a' && currentChar <= 'f')
            {
                charValue = currentChar - 'a' + 10;
            }
            // 计算当前位的权重,加0.5抵消pow的浮点精度误差
            int weight = (int)(pow(16, strLen - 1 - j) + 0.5);
            decResult += charValue * weight;
        }
        cout << "第" << i + 1 << "个十六进制数的十进制结果为:" << decResult << endl;
    }

    // 释放堆内存,避免泄漏
    delete[] hexInputs;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 11:54:04