回复 9楼 ppfly
呵呵!谢谢你!我现在不在宿舍!等我会宿舍如果没疑问了就结贴哈
#include<stdio.h> #include<stdlib.h> #include<string.h> int t; char* getnum(char*p)// 输入字符串 { int i=0; p=(char*)malloc(sizeof(char));//开辟一个区间先 while ((p[i++]=getchar())!='\n')//判断 并 输入p[i] { p=(char*)realloc(p,(i+1)*sizeof(char));// } p[i-1]='\0'; //把最后一项 变成'\0’ 这个我还是不懂//原来字符串最后是'\n',现在换成字符串结束标志'\0' printf("验证i=%d\n",i); return p; } int* bigadd(int*num,char*p1,char*p2)//相加 { int n=0,i; int ch1_n,ch2_n; ch1_n=strlen(p1);//判断p1的长度 减去多分配的一个区间 ch2_n=strlen(p2);//判断p2的长度 减去最后那个多余无值区间 printf("ch2_n=%d\n",ch2_n); printf("验证ch1_n=%d\n",ch1_n); num=(int*)malloc(sizeof(int)); while (ch1_n>=0||ch2_n>=0) { --ch1_n; //其实这个判断可以省略 --ch2_n; if (ch1_n>=0&&ch2_n>=0) num[n]=(p1[ch1_n]-'0')+(p2[ch2_n]-'0');//如果两个都还有数没有加 else if (ch1_n<0&&ch2_n>=0) num[n]=p2[ch2_n]-'0';//如果p1已经取完数 else if(ch1_n>=0&&ch2_n<0) num[n]=p1[ch1_n]-'0'; //p2取完数 num=(int*)realloc(num,(++n+1)*sizeof(int));//只要两个不同时已经取完数 就要继续分配一个区间,那么最后有一个多余 //n++; } for(i=0;i<n-1;i++) printf("%d\n",num[i]); t=n-1; //为什么是t=n-1 不是一共分配了n+1个区间吗?//最后多分配的那个没用的, //所以下标为n-1时正好对应第n printf("验证n=%d\nt=%d\n",n,t); num[t]=0;//把最后那区域赋值给0 预防上一位也要进位 //先记下num一共多少位。 return num; } int* carry(int*num) //进位 { //for (int n=0;n<=t;) //从第一位开始到第t位 一直进位 帮我看看这个n<=t 有没有错 //这里没必要搞个双重循环 //{ int n=0; while (num[n]>=10&&n<=t)//当num的值大于10时候 { num[n++]-=10;// num自减10; num[n]+=1;// 下一位数+1; //continue; } // n++;//判断下一位数 //} return num; //返回num指针 } void printnum(int*num)//输出num的数组 { t=(num[t]==0)?t-1:t; while(t>=0) //为什么不是t>=0 ?? num[0]q去哪了?//就应该是t>=0的啊,你这样写当num[t]!=0时 //即原最高位有进位时会少输出一位的,可以找个数试试 {printf("%d",num[t]); t--; } } int main() { int *num; char*p1,*p2; p1=getnum(p1); p2=getnum(p2); num=bigadd(num,p1,p2); printnum(carry(num)); free(num); system("pause"); return 0; }
p[i]='\0';//这一句已经越界,存在隐患的。因为你只是分配了i个字节,但是你现在要将第i+1个字节内容改为'\0',所以这是个bug,最后接受的回车符完全没用的所以最好是 p[i-1]='\0';//因为这样num[0]中也存的是有效数字了,楼主好好考虑下