【发布时间】:2021-12-15 19:30:11
【问题描述】:
我想将数字 X 从“输入”数字系统转换为“输出”数字系统并将结果存入输出。我是第一次使用 malloc,我不知道如何正确使用它。该程序有效,但它返回 -1073740940,我没有得到任何数字和结果。如果输出系统与输入相同,则此函数采用数字,则返回相同的数字。否则它开始转换。不知道哪里出错了。但是当我使用printf("HERE") 来定位错误时,在这个命令之后它是tab = malloc(N* sizeof(int));,它不再起作用了。 Fill 和 Filli 函数将所有数组填充为 NULL。你有这个功能下的转换。请帮忙。我需要这么快结束这个项目。我没有时间。 N 是 4000。它是定义的。我正在使用 scanf 读取这 3 个变量,而不是 argumentx = malloc(N * sizeof(char)); conversion(input, output, x, argumentx);所以没有人知道出了什么问题:)))))))谢谢
void conversion(int input, int output, char* x, char* out)
{
int length = strlen(x), which = 0, le, tmp, y, k, first = 0, howmuch = 0, len, len2;
int *tab, *carry, *end;
len = length + 3;
for (int i = 0; i < length; i++)
{
if (x[i] >= '0' && x[i] <= '9')
{
if (x[i] - '0' >= input)
{
bad = 1;
return;
}
}
if (x[i] >= 'A' && x[i] <= 'Z')
{
if (x[i] - 'A' >= input)
{
bad = 1;
return;
}
}
if (x[i] > 'Z')
{
bad = 1;
return;
}
}
if (input == output) {
for (int i = 0; i < length; i++)
{
out[i] = x[i];
}
return;
}
tab = malloc(N* sizeof(int));
printf("flaga\n");
for (int i = length - 1; i >= 0; i--)
{
if (x[i] >= '0' && x[i] <= '9')
{
tab[which++] = (int)(x[i] - '0');
}
else
{
tab[which++] = 10 + (int)(x[i] - 'A');
}
}
if (length * (input / (output)) > length * (output / (input)))
{
le = length * (input / (output));
}
else
{
le = length * (output / (input));
}
len2 = which * le + 3;
carry = malloc(N * sizeof(int));
end = malloc(N * sizeof(int));
filli(len2,carry);
filli(len2,end);
carry[0] = 1;
for (int i = 0; i < which; i++)
{
for (int j = 0; j < le; j++)
{
end[j] += carry[j] * tab[i];
tmp = end[j];
y = 0;
k = j;
do {
y = tmp / output;
end[k] = tmp - y * output;
k++;
end[k] += y;
tmp = end[k];
} while (tmp >= output);
}
for (int j = 0; j < le; j++)
{
carry[j] = carry[j] * input;
}
for (int j = 0; j < le; j++)
{
tmp = carry[j];
y = 0;
k = j;
do {
y = tmp / output;
carry[k] = tmp - y * output;
k++;
carry[k] += y;
tmp = carry[k];
} while (tmp >= output);
}
}
fill(out);
tmp = 0;
first = 0;
for (int i = le; i >= 0; i--)
{
if (end[i] != 0)
{
first = 1;
}
if (first == 0)
{
continue;
}
if (end[i] < 10)
{
out[tmp] = (char)(end[i] + '0');
tmp++;
}
else
{
out[tmp] = (char)(end[i] + 'A' - 10);
tmp++;
}
}
out[tmp] = out[tmp + 1];
free(carry);
free(end);
free(tab);
return;
}
void fill(char* x)
{
int length = strlen(x);
for (int i = 0; i < length; i++)
{
x[i] = (char)NULL;
}
return;
}
void filli(int length,int* x)
{
for (int i = 0; i < length; i++)
{
x[i] = (int)NULL;
}
return;
}
【问题讨论】:
-
什么是
N?测试中如何调用conversion函数?代码不完整。请提供完整的代码minimal reproducible example。 -
无关:你为什么用
NULL分配给chars和ints?x[i] = '\0';和x[i] = 0;似乎更合适。 -
空填充(char* x) { int length = strlen(x); for (int i = 0; i
-
但是 void fill(charx) 只用于填充(out),out是char filli(int* x)
-
如前所述,请发minimal reproducible example;否则你可能不会得到答案。人们找出问题所在的最佳方法是实际编译、测试和运行它,并输入导致问题发生的输入。期望人们花一个小时研究 150 行代码是不合理的,而通过使用适当的调试工具运行它,他们很可能会在两分钟内找到问题。 (你也一样。你知道如何使用调试器吗?你试过 valgrind、AddressSanitizer 等工具吗?)
标签: arrays c char integer malloc