c - 通过指针中的索引访问和存储值

标签 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 指针的相应位置

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

所以问题是,我如何让这个操作按预期工作?调试代码时,我注意到它第一次将第一个结果存储在 result->string 中,按照上面的示例,这将是一个数字 4,而是将垃圾存储在该位置。在第二次加法中,我正确地存储了一个数字 2,这就是我在打印结果时得到的最终结果。

最佳答案

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

itoa function将它的第一个参数转换成一个以空字符结尾的字符串 - 所以,除了在字符串的指定位置写入 digitResult 的字符表示,它还 strong>在其后添加一个 '\0' 字符。因此,您的字符串将总是在您写入的最后一个数字之后立即终止,12 + 12,得到24 将显示为第一个字符:2

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

所以,而不是:

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

使用:

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

关于c - 通过指针中的索引访问和存储值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64138573/

相关文章:

在 C 中从终端控制进程

c - 为什么 valgrind 不检测数组中的多余元素

c - 您是否使用 TR 24731 'safe' 功能?

创建一个非阻塞定时器来删除数据

c - C 中的不可整子集 Hackerrank 解决方案

c - 在这种情况下是否需要屏蔽?

c - Netbeans 可执行 Linux C

c - "more"作为管道命令的目标会破坏 bash

c - C 中的连续指针转换

c - 大整数模幂