Psy358 2023-03-30 21:55 采纳率: 90.9%
浏览 19
已结题

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

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


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

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<m 而不是n<i 
    {
        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

  • 写回答

3条回答 默认 最新

  • threenewbee 2023-03-30 22:06
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月27日
  • 已采纳回答 6月19日
  • 创建了问题 3月30日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题