Ваша первая проблема заключается здесь:
fgets(str1,MAX,stdin);
Если вы введете здесь 27
, ваш строковый буфер будет содержать "27\n"
, с новой строкой
Поскольку вы не хотите ничего делать с этой новой строкой, вы должны установить длину соответственно:
len1 = strlen(str1) - 1;
Во-вторых, вы можете сэкономить много if
, просто сделав строки одинаковой длины как можно раньше:
if (len1 < len2) {
strcpy(str, str1);
memset(str1, '0', len2 - len1);
strcpy(&(str1[len2 - len1]), str);
len1 = len2;
} else if (len1 > len2) {
strcpy(str, str2);
memset(str2, '0', len1 - len2);
strcpy(&(str2[len1 - len2]), str);
len2 = len1;
}
Как только это будет сделано, вам больше не нужно беспокоиться о том, какая длина длиннее, и ваш код может быть намного проще.
Тогда это просто вопрос (как вы это сделали), начиная справа, добавляя каждое di git и сохраняя результат. Вам просто нужно убедиться, что вы оставили место для окончательного переноса (избыток на вашем исходном языке).
Ваш код уже делает это, но, как было предложено, его можно значительно упростить благодаря работе, проделанной заранее до получить числа одинаковой длины.
Окончательный полный код приведен ниже, с дополнительной проверкой, чтобы убедиться, что введены все числа c, корректировка, чтобы избавиться от нулевого окончательного переноса, и с большим количеством меньше переменных:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 10000
int main(void) {
char str1[MAX], str2[MAX], str[MAX];
printf("Enter first number : ");
fgets(str1, MAX, stdin);
printf("Enter second number : ");
fgets(str2, MAX, stdin);
int len1 = strlen(str1) - 1;
int len2 = strlen(str2) - 1;
// Get both to same length quickly. We'll only use
// len1 after that.
if (len1 < len2) {
strcpy(str, str1);
memset(str1, '0', len2 - len1);
strcpy(&(str1[len2 - len1]), str);
len1 = len2;
} else if (len1 > len2) {
strcpy(str, str2);
memset(str2, '0', len1 - len2);
strcpy(&(str2[len1 - len2]), str);
}
// Now just start at right and do it digit by digit,
// leaving room for final carry.
int carry = 0;
str[len1 + 1] = '\0';
for (int i = len1; i > 0; --i) {
// Catch any input problems.
if (! ( isdigit(str1[i-1]) && isdigit(str2[i-1]))) {
printf("*** ERROR: Non-digit character in number\n");
return -1;
}
// Work out digit and new carry.
int newDigit = str1[i-1] - '0' + str2[i-1] - '0' + carry;
carry = newDigit / 10;
newDigit = newDigit % 10;
str[i] = newDigit + '0';
}
// Insert final carry if non-zero, otherwise safely move
// all digits left (overlapping memory needs memmove).
if (carry != 0) {
str[0] = carry + '0';
} else {
memmove(str, &(str[1]), len1 + 1);
}
// Output the result.
printf("The sum is %s\n", str);
return 0;
}