【发布时间】:2021-02-03 17:59:54
【问题描述】:
所以我需要制作一个十六进制到十进制的转换器,用户可以在其中决定要输入多少个数字(例如,如果他输入 3,程序让他写 3 个十六进制数字,然后转换为十进制),但正如我所说在我必须手动进行转换之前,我只能使用库 iostream、cstring 和 cmath。而且我不能使用字符串(当用户输入十六进制数字时,它们不能是字符串(真的不知道如何解释)所以例如十六进制数字将存储在 char hex 而不是 string hex)如果你能帮助我,我将非常感激,我希望我能把问题描述得足够好!
这是我的尝试(我是编程新手,所以很糟糕)
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int broj;
do
{
cout << "Unesite broj brojeva: ";
cin >> broj;
}
while (broj < 1);
char *hex = new char [broj];
for (int i = 0; i < broj; i++)
{
cout << "Unesite " << i+1 << ". broj: ";
cin >> hex[i];
}
for (int i = 0; i < broj; i++)
{
char idk[10000];
idk[10000] = hex[i];
int duljina = strlen(idk);
int pom = 0;
int halp = duljina;
for (int j = 0; i < duljina; i++)
{
if (idk[j] == 'A' || idk[j] == 'a') idk[j] = 10;
if (idk[j] == 'B' || idk[j] == 'b') idk[j] = 11;
if (idk[j] == 'C' || idk[j] == 'c') idk[j] = 12;
if (idk[j] == 'D' || idk[j] == 'd') idk[j] = 13;
if (idk[j] == 'E' || idk[j] == 'e') idk[j] = 14;
if (idk[j] == 'F' || idk[j] == 'f') idk[j] = 15;
pom += idk[j]*(pow(16, halp));
halp--;
}
cout << pom << endl;
}
return 0;
}
它不起作用。
【问题讨论】:
-
idk[10000] = hex[i];这是一个错误的超出范围的访问。 -
int duljina = strlen(idk);这是未初始化变量的错误用法。 -
idk[10000] = hex[i];将大小为 10000 的数组的第 10001 个元素设置为 hex[i] 的单个元素的值。这是修改超出数组末尾的元素的未定义行为。 -
如果你不能使用c++标准库中的
std::string类,你必须自己实现它的功能,特别是原始char数组的内存管理,使用new []分配,并使用delete[]正确释放。它可以帮助您研究std::string的实现,并且可能会简化它以满足您的需求。