我有一个作业,必须将整数加起来最多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,这是打印结果时得到的最终结果。
答案 0 :(得分:1)
您使用itoa
函数 是一个问题(尽管,正如您所建议的那样,也许不是唯一的问题)。
itoa
function将其第一个参数转换为以空终止的字符串-因此,还要在字符串的指定位置写入digitResult
的字符表示形式,它还会在 之后添加一个'\0'
字符 。因此,您的字符串将总是在您写入的最后一位数字之后立即终止,并且12
+ 12
(给出24
)似乎只是第一个字符:2
。
您可以做的是自己转换数字(反转用于获取d1
和d2
值的操作),然后直接 设置字符串元素转换为数字。
所以,而不是:
itoa(digitResult, &result->string[index], 10);
使用:
result->string[index] = (char)(digitResult + '0');