通过指针访问和存储值

时间:2020-09-30 13:23:40

标签: c

我有一个作业,必须将整数加起来最多100个数字。

他们给了我这个表示大数的结构(我认为有更好的方法来表示它,但我不允许对其进行修改):

typedef struct {
  char* string;
  int lengthError;
} BigNumber;

其中string是数字本身,lengthError是数字的长度或错误,它是先前定义的枚举。

我也已经实现了求和功能

BigNumber *sum(BigNumber* num1, BigNumber* num2) {
    BigNumber* result = malloc(sizeof(BigNumber));
    int limit = getLength(num1->lengthError, num2->lengthError);
    result->string = malloc(limit);
    int digitResult;
    int index = limit -1;
    int carry = 0;

    while(index != -1) {
        int d1 = ((int)num1->string[index]) - ((int)'0');
        int d2 = ((int)num2->string[index]) - ((int)'0');
        digitResult = d1 + d2 + carry;

        if (digitResult > 9) {
            digitResult = digitResult - 10;
            carry = 1;
        } else {
            carry = 0;
        }

        itoa(digitResult, &result->string[index], 10); //I think this is the problem
        index--;
    }

    result->string[limit] = '\0';
    printf("result: %s\n", result->string);
    return result;
}

我还没有完成该函数的编写,我知道其中有很多缺陷,但是问题是我无法求和12 +12。我得到的结果是2。

我想通过选择两个数字的尾号来解决这个问题,将它们转换成int并考虑进位数字求和。在digitResult中获得结果后,我尝试将其转换为char并将其存储在result->string指针的相应位置

操作完成后,我在\0的最后一个位置添加了一个result->string

问题是,如何使此操作按需运行?在调试代码时,我注意到它第一次将第一个结果存储在result-> string中,在上面的示例中,它是一个数字4,它将垃圾存储在该位置。在第二个结果中,我正确地存储了数字2,这是打印结果时得到的最终结果。

1 个答案:

答案 0 :(得分:1)

您使用itoa函数 是一个问题(尽管,正如您所建议的那样,也许不是唯一的问题)。

itoa function将其第一个参数转换为以空终止的字符串-因此,还要在字符串的指定位置写入digitResult的字符表示形式,它还会在 之后添加一个'\0'字符 。因此,您的字符串将总是在您写入的最后一位数字之后立即终止,并且12 + 12(给出24)似乎只是第一个字符:2

您可以做的是自己转换数字(反转用于获取d1d2值的操作),然后直接 设置字符串元素转换为数字。

所以,而不是:

    itoa(digitResult, &result->string[index], 10);

使用:

    result->string[index] = (char)(digitResult + '0');