我在 malloc 中哪里犯了错误?

Where am i doing a mistake in malloc?

提问人:Martfosz 提问时间:11/1/2021 最后编辑:Martfosz 更新时间:11/1/2021 访问量:71

问:

我想将数字 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;
}
数组 c char integer malloc

评论

3赞 kaylum 11/1/2021
什么?测试中如何调用函数?代码不完整。请提供完整的代码作为最小的可重现示例Nconversion
0赞 Ted Lyngmo 11/1/2021
不相关:为什么要用于分配给 s 和 s? 而且似乎更合适。NULLcharintx[i] = '\0';x[i] = 0;
0赞 Martfosz 11/1/2021
void fill(char* x) { int length = strlen(x); for (int i = 0; i < length; i++) { x[i] = '\0';; } return; } void filli(int length,int* x) { for (int i = 0; i < length; i++) { x[i] = 0; } return; } return; }
0赞 Martfosz 11/1/2021
但是 void fill(char x)仅用于 fill(out),而 out 是 char filli(int* x)
1赞 Nate Eldredge 11/1/2021
如前所述,请制作一个最小的可重复示例;否则,您可能不会得到答案。人们找出问题所在的最佳方式是实际编译、测试和运行它,并使用使问题发生的输入。期望人们花一个小时研究 150 行代码是不合理的,而通过使用适当的调试工具运行它,他们很可能在两分钟内找到问题。(你也可以。您知道如何使用调试器吗?您是否尝试过 valgrind、AddressSanitizer 等工具?

答:

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-恢复莫妮卡:)