gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:53:10 27 4
gpt4 key购买 nike

我有一项作业,我必须对最多 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com