首页 > 解决方案 > 我在 malloc 哪里做错了?

问题描述

我想将数字 X 从“输入”数字系统转换为“输出”数字系统,结果保存在输出中。我是第一次使用 malloc,我不知道如何正确使用它。该程序有效,但它返回 -1073740940,我没有得到任何数字和结果。如果输出系统与输入相同,则此函数采用数字,则返回相同的数字。否则它开始转换。不知道哪里出错了。但是当我printf("HERE")用来定位错误时,tab = malloc(N* sizeof(int));在这个命令之后它就不再起作用了。Fill 和 Filli 函数将所有数组填充为 NULL。你有这个功能下的转换。请帮忙。我需要这么快结束这个项目。我没有时间。N 是 4000。它是定义的。我正在使用 scanf 来读取这 3 个变量而不是我argumentx = malloc(N * sizeof(char));转换(输入,输出,x,参数x);所以没有人知道出了什么问题:))))))) 谢谢

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;
}

标签: arraysccharintegermalloc

解决方案


我会将任务分为两个功能。

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));
}

推荐阅读