可以在C中添加非常大的数字,但不能添加小的数字

可以在C中添加非常大的数字,但不能添加小的数字,c,C,我有一个C程序,可以添加大的数字,它工作得很好,但我也需要添加较小的数字,但我得到一个奇数输出,不确定错误来自哪里 #include<stdio.h> #include<string.h> int main() { int num1[255], num2[255], sum[255], m = 0, z, x = 0; char s1[255], s2[255], in[255]; int l1, l2; printf("enter the input as a+b=

我有一个C程序,可以添加大的数字,它工作得很好,但我也需要添加较小的数字,但我得到一个奇数输出,不确定错误来自哪里

#include<stdio.h>
#include<string.h>

int main() {
int num1[255], num2[255], sum[255], m = 0, z, x = 0;
char s1[255], s2[255], in[255];
int l1, l2;

printf("enter the input as a+b=\n");
scanf("%s", in);
for (z = 0; in[z] != '+'; z++) {
    s1[z] = in[z];
    m++;
}

for (z = m + 1; z < strlen(in) - 1; z++) {
    s2[x] = in[z];
    x++;
}

for (l1 = 0; s1[l1] != '\0'; l1++)
    num1[l1] = s1[l1] - '0';
for (l2 = 0; s2[l2] != '\0'; l2++)
    num2[l2] = s2[l2] - '0';

int carry = 0;
int k = 0;
int i = l1 - 1;
int j = l2 - 1;

for (; i >= 0 && j >= 0; i--, j--, k++) {
    sum[k] = (num1[i] + num2[j] + carry) % 10;
    carry = (num1[i] + num2[j] + carry) / 10;
}

if (l1 > l2) {
    while (i >= 0) {
        sum[k++] = (num1[i] + carry) % 10;
        carry = (num1[i--] + carry) / 10;
    }

    if (carry != 0) {
        sum[k] = carry;
        k = k + 1;
    }
} else if (l1 < l2) {
    while (j >= 0) {
        sum[k++] = (num2[j] + carry) % 10;
        carry = (num2[j--] + carry) / 10;
    }

    if (carry != 0) {
        sum[k] = carry;
        k = k + 1;
    }
} else {

    if (carry > 0)
        sum[k++] = carry;
}

printf("%s+%s=\n", s1, s2);

for (k--; k >= 0; k--)
    printf("%d", sum[k]);
return 0;
}
如果我输入一个值,例如:

以a+b的形式输入输入=

9999999999999999999999999999999999+1=

我得到了我想要的结果

9999999999999999999999999999999999+1=

100000000000000000000

当我尝试更小的东西时,比如:

123+456=

输出是不同的

123ó+456=

16-5-6

我不知道这些数字是从哪里来的,任何小于99999999999999999999999999999999999999+1的数字都会出现这种情况=它应该适用于任何数字,而不仅仅是一组

for (l1 = 0; s1[l1] != '\0'; l1++)
//           ^^^^^^^^^^^^^^
这里有一个问题:您正在检查s1中的“\0”,但从未将s1的任何元素设置为“\0”,因此这将访问未初始化的内存,并可能超出数组的界限

s2也有同样的问题

可能还有其他问题,但这就是我停止阅读的地方

一般性意见:

永远不要使用scanf。 如果这样做,请始终检查其返回值以确保其成功。 永远不要将%s与scanf一起使用。这是一个等待发生的缓冲区溢出。 您的代码对输入的外观做出了非常严格的假设。如果用户没有准确键入您的代码所期望的内容,则会发生有趣的事情,例如,z=0的第一个;在[z]!='+';如果字符串中没有+,z++循环将超出边界。你可能应该验证你的假设,而不是盲目地假设一切正常。
@风向标为什么?输入格式是a+b=,所以最后一个字符是“=”,而不是数字@哦,是的。