实现字符串输入整数取相加的结果

实现字符串输入整数取相加的结果
代码好像是正确的 实验了几组相加的结果
但是如果999999999999999999999999999999999999999 + 9999999999999999999999999999999999999999999999999999 的结果会有一个冒号 是什么原因导致的呢?


#include
#include 
#include 

char *FZ(char *a); 
char *FZ(char *a) 
{
    
    char ch;
    int n,m,i;
    int s = strlen(a);
    m = s/2;
    i = s;
    for(n = 0;n < m; n++) //高位换低位只换到一半的值 所以n
    {
        ch = a[n];
        a[n] = a[--i];
        a[i] = ch;
    }
    
    a[s] = '\0';
//    printf("打印ptr反转:%s结束\n\n",a);
   
    return a;
    
}

char *SR();
char *SR()
{
    int i,count = 0;
    char num;
    char *ptr = NULL;
    
    printf("请输入一个整数:");
    do
    {
        scanf("%c",&num);
        count++;
        ptr = (char *)realloc(ptr,count * sizeof(char));
        if(ptr == NULL)
        {
            exit(1);    
        } 
        ptr[count - 1] = num;
    }while(num != '\n');

    ptr[count - 1] = '\0';
    
//    printf("打印ptr:%s结束\n\n",ptr); 

    return ptr;
}

int main()
{
    char *a = SR();
    char *b = SR();
    int MIN,MAX,F;
    
    
    if(strlen(a) > strlen(b))
    {
        MIN = strlen(b);
        MAX = strlen(a);
        F = 0;
    }
    else
    {
        MIN = strlen(a);
        MAX = strlen(b);
        F = 1;
    }
    a = FZ(a);
//    printf("打印ptr a 反转:%s结束\n\n",a);
    b = FZ(b);
//    printf("打印ptr b 反转:%s结束\n\n",b); 
    
    int s = 0;
    char *c = (char *)malloc((MAX+1) * sizeof(char));
        if(c == NULL)
        {
            exit(1);    
        }

    int n; 
    for(n = 0;n < MIN; n++)
    {
        if(a[n]+b[n]+s < 106)
        {
            c[n] = (a[n]+b[n]+s) % 48 + 48;
            s = 0;
        }
        else
        {
            c[n] = (a[n]+b[n]+s) % 48 + 38;
            s = 1;
            if(n == MIN-1 && MIN == MAX)
            {
            
                c = (char *)realloc(c,sizeof(char));
                if(c == NULL)
                {
                    exit(1);    
                }
                c[n+1] = '1'; 
                c[n+2] = '\0';
            }
        }
    }
    
    if(MIN != MAX)
    {
        if(F == 0)
        {
            c[n] = a[n]+s;
            while(n < MAX - 1)
            {
                n++;
                c[n] = a[n];
                
            }
        }
        
        if(F == 1)
        {    
            c[n] = b[n]+s;
            while(n < MAX - 1)
            {
                n++;
                c[n] = b[n];
                
            }
            
        }
        c[MAX] = '\0';
    }
    c = FZ(c);
    
    printf("计算结果是:"); 
    printf("%s",c);
    
    free(a);
    free(b);
    free(c);
    
    return 0;
}

代码好像是正确的 实验了几组相加的结果
但是如果999999999999999999999999999999999999999 + 9999999999999999999999999999999999999999999999999999 的结果会有一个冒号 是什么原因导致的呢?

img

img

img

img

我猜是字符串长度越界,读到别的内存上了
加大字符串缓冲区长度

我觉得冒号出现的原因是因为您在打印结果的时候,没有在最后加上换行符 \n,导致输出结果和后面的输入提示信息在同一行显示,看上去像是有一个冒号。您可以将 printf("计算结果是:"); 改为 printf("计算结果是:%s\n", c);,加上换行符即可解决。 你可以试一下

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^