提问人:Martfosz 提问时间:11/1/2021 最后编辑:Martfosz 更新时间:11/1/2021 访问量:71
我在 malloc 中哪里犯了错误?
Where am i doing a mistake in malloc?
问:
我想将数字 X 从“输入”数字系统转换为“输出”数字系统,结果保存在输出中。我是第一次使用 malloc,我不知道如何正确使用它。该程序有效,但它返回 -1073740940,我没有得到任何数字和结果。此函数取数字,如果输出系统与输入相同,则返回相同的数字。否则,它将开始转换。我不知道哪里有错误。但是当我用来定位错误时,它是在这个命令之后,它不再起作用了。Fill 和 FIlli 函数填充 NULL 中的所有数组。转换下有此函数。请帮忙。我需要这么快结束这个项目。我没有时间。N 为 4000。这是定义的。我正在使用 scanf 读取这 3 个变量,而不是 conversion(input, output, x, argumentx);所以没人知道出了什么问题:))))谢谢printf("HERE")
tab = malloc(N* sizeof(int));
argumentx = malloc(N * sizeof(char));
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;
}
答:
1赞
0___________
11/1/2021
#1
我会将任务拆分为两个功能。
static const char digits[] = "0123456789abcdefghijklmnoprqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned long long fromString(const char *input, const unsigned base)
{
unsigned long long result = 0;
if(base > 1 && base <= sizeof(digits))
{
while(*input)
{
const char *res;
if(!(res = strchr(digits, *input)) || (res - digits) >= base)
{
result = 0;
break;
}
result *= base;
result += res - digits;
input++;
}
}
return result;
}
char *toString(unsigned long long val, const unsigned base)
{
size_t length = 1;
unsigned long long mask = 1, wrk = val;
char *result = NULL;
if(base > 1 && base <= sizeof(digits))
{
do {++length; mask *= length > 2 ? base : 1;} while(wrk /= base);
result = malloc(length);
if(result)
{
char *wrkresult = result;
do
{
*wrkresult++ = digits[val / mask];
val %= mask;
}while(mask /= base);
*wrkresult = 0;
}
}
return result;
}
char *fromAtoB(const char *input, const unsigned inputBase, const unsigned outputBase)
{
return toString(fromString(input, inputBase), outputBase);
}
int main(void)
{
printf("%s", fromAtoB("255", 10, 16));
}
评论
0赞
chux - Reinstate Monica
11/1/2021
toString(0, base)
看起来像个问题。也许?do { ... } while (wrk /= base);
0赞
0___________
11/1/2021
@chux-恢复莫妮卡确实,第一次错误有点不一致,第二点还行。迟到编程:)
0赞
chux - Reinstate Monica
11/1/2021
我们都需要我们的美容睡眠。11月见。
0赞
0___________
11/1/2021
@chux-恢复莫妮卡:)
评论
N
conversion
NULL
char
int
x[i] = '\0';
x[i] = 0;