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
相关产品推荐
相关产品推荐

