易错点:指针从最后一位开始
各个循环条件不要写错了
malloc注意判断空,并且要多申请两个字节
进位逻辑
翻转堆区的内存保存的值
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* addStrings(char* num1, char* num2) {
int len1 = strlen(num1);
int len2 = strlen(num2);
char* p1 = num1 + len1 - 1;//减去本身指向个位
char* p2 = num2 + len2 - 1;
char* d = (char*)malloc((len1 > len2 ? len1 : len2) + 2);//为啥要加二呢
if (d == NULL) {
printf("malloc申请失败\n");
return NULL;
}
//原因是有进位和\0末尾
int i = 0;
char carry = 0;//进位
while (i<len1||i<len2||carry==1) {
char k = 0, l = 0;
if (i < len1) {//i要取到len
k = *(p1-i) - '0';
}
if (i < len2) {
l = *(p2-i) - '0';
}
char sum = k + l + carry;
d[i] = sum % 10 + '0';
if (sum >= 10)carry = 1;
else carry = 0;
i++;
}
//翻转堆区的数据
int left = 0, right = i - 1;
while (left < right) {
char temp = d[left];
d[left] = d[right];
d[right] = temp;
left++, right--;
}
d[i] = '\0';
return d;
}
int main() {
char arr[100];
char brr[100];
printf("请输入两个数字\n");
while (scanf("%s %s", arr, brr) != EOF) {
printf("它们相加的结果是:");
char* p = addStrings(arr, brr);
printf("%s",p);
free(p);
printf("\n");
printf("请输入两个数字\n");
}
return 0;
}