大一新生C语言求助。

鱼鱼鱼的记录 2017-12-24 11:14:50
想进行两个任意大的数相加,要以字符形式输入,考虑进位,我现在还不能运用好动态数组就没无限大。但是我下面的代码编译没问题 运行就是错的,想请教我错在哪?






#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n1,n2,h[1000];
int main()
{
void sum(int *a,int *b,int k1,int k2);//相加函数。
char *a,*b;
a=(char *)malloc(100);
b=(char *)malloc(100);
scanf("%s%s",a,b);//以字符串形式输入。
n1=strlen(a); //得出位数。
n2=strlen(b);
int *p1=(int *)a; //转化为整形。
int *p2=(int *)b;
int c[n1],d[n2],n;
for(n=0;n<n1;n++)//分别赋值到两个数组。
{
c[n]=*(p1+n);
}
for(n=0;n<n2;n++)
{
d[n]=*(p2+n);
}
sum(c,d,n1,n2);
for(n=0;n<1000;n++)//输出相加结果。
{
if((h[n])=='\0') continue;
printf("%d",h[n]);
}
return 0;
}
void sum(int *a,int *b,int k1,int k2)
{
int m1,m2,c,n=999;
for(m1=k1-1,m2=k2-1;(m1>=0)&&(m2>=0);m1--,m2--,n--)//从个为开始加,当有其中一个数位数加尽了停止循环。
{
if(c=(*(a+m1)+*(b+m2)+h[n])>9)//当两个相同位和h数组(即可能上一位进了一)相加大于9时。
{
h[n]=c-10;//和为相加和减去10加上本身的值.
h[n-1]++;
}
else h[n]=(*(a+m1)+*(b+m2))+h[n];//如没有大于9则不用减10.
while((m1<0)&&(m2>=0))//即当a数组位数小时。
{
h[n--]=b[m2--];
}
while(m2<0&&m1>=0)
{
h[n--]=b[m1--];
}
}
}
...全文
182 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xueyu人生 2018-11-15
  • 打赏
  • 举报
回复
可以再“调试”中设置断点,F5运行,进行调试,看堆栈,看看问题出在哪里了,在通过F10,F11通过逐步或逐过程进行调试
鱼鱼鱼的记录 2017-12-26
  • 打赏
  • 举报
回复
引用 10 楼 SXJIAKE 的回复:
[quote=引用 6 楼 zaokang5603 的回复:] 我说两点吧: 1.int *p1 = (int *)a; // int *p2 = (int *)b; 这个代码有问题,上面执行的结果就是把Assisc码转化为整形,例如‘a’变为整形就是97,你可以试着通过下面的函数进行转化:int atoi(char *); 1.int c[n1], d[n2] n1和n2没有初始化,应该编译不过去吧, for (n = 0; n<n1; n++)//分别赋值到两个数组。 { c[n] = *(p1 + n); } for (n = 0; n<n2; n++) { d[n] = *(p2 + n); } 其实可以给c[100],d[100],想把指针里的内容复制到数组中,可以通过结束符‘\0’判断停止
如果你是将 acsii 转为整型,需要转吗?直接用不就是了吗?再说了,也不能 char * 到 int *,一个 1 字节指针,一个 4 字节指针,怎么转?[/quote]我懂了
leetow2006 2017-12-25
  • 打赏
  • 举报
回复
调试:可以用输出某些值,来判断错误,这种方法比较简单
xueyu人生 2017-12-25
  • 打赏
  • 举报
回复
是不是就是任意两个字符整数相加,最后输出就可以了,怎么感觉你的代码弄得复杂了呢 下面代码仅供参考: char *a,*b; a=(char *)malloc(100); b=(char *)malloc(100); scanf("%s%s",a,b);//以字符串形式输入 int num1 =atoi (a); int num2 =atoi(b); int sum =num1 +num2; printf("%d\n",sum); 而且在控制台就是以字符串输入的,我们使用scanf("%d%d",a,b)把字符串格式化为为整形复制给a和b。所以 int a,b; scanf("%d%d",&a,&b);//以字符串形式输入 int sum =a+b; 可能我理解的有问题把,仅供参考
xueyu人生 2017-12-25
  • 打赏
  • 举报
回复
我说两点吧: 1.int *p1 = (int *)a; // int *p2 = (int *)b; 这个代码有问题,上面执行的结果就是把Assisc码转化为整形,例如‘a’变为整形就是97,你可以试着通过下面的函数进行转化:int atoi(char *); 1.int c[n1], d[n2] n1和n2没有初始化,应该编译不过去吧, for (n = 0; n<n1; n++)//分别赋值到两个数组。 { c[n] = *(p1 + n); } for (n = 0; n<n2; n++) { d[n] = *(p2 + n); } 其实可以给c[100],d[100],想把指针里的内容复制到数组中,可以通过结束符‘\0’判断停止
「已注销」 2017-12-25
  • 打赏
  • 举报
回复
原来字符串数组可以强转为数字数组,开眼界了……
int *p1=(int *)a; //转化为整形。 
int *p2=(int *)b;
「已注销」 2017-12-25
  • 打赏
  • 举报
回复
引用 6 楼 zaokang5603 的回复:
我说两点吧: 1.int *p1 = (int *)a; // int *p2 = (int *)b; 这个代码有问题,上面执行的结果就是把Assisc码转化为整形,例如‘a’变为整形就是97,你可以试着通过下面的函数进行转化:int atoi(char *); 1.int c[n1], d[n2] n1和n2没有初始化,应该编译不过去吧, for (n = 0; n<n1; n++)//分别赋值到两个数组。 { c[n] = *(p1 + n); } for (n = 0; n<n2; n++) { d[n] = *(p2 + n); } 其实可以给c[100],d[100],想把指针里的内容复制到数组中,可以通过结束符‘\0’判断停止
如果你是将 acsii 转为整型,需要转吗?直接用不就是了吗?再说了,也不能 char * 到 int *,一个 1 字节指针,一个 4 字节指针,怎么转?
鱼鱼鱼的记录 2017-12-25
  • 打赏
  • 举报
回复
知道了些我还不太会,继续学习。
鱼鱼鱼的记录 2017-12-24
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
出错了中断下来,通过调用堆栈定位到相关位置,分析原因
你说的什么调用的我都不会。。
paschen 2017-12-24
  • 打赏
  • 举报
回复
出错了中断下来,通过调用堆栈定位到相关位置,分析原因
鱼鱼鱼的记录 2017-12-24
  • 打赏
  • 举报
回复
#include<stdio.h> #include<string.h> #include<stdlib.h> int n1,n2,h[1000]; int main() { void sum(int *a,int *b,int k1,int k2);//相加函数。 char *a,*b; a=(char *)malloc(100); b=(char *)malloc(100); scanf("%s%s",a,b);//以字符串形式输入。 n1=strlen(a); //得出位数。 n2=strlen(b); int *p1=(int *)a; //转化为整形。 int *p2=(int *)b; int c[n1],d[n2],n; for(n=0;n<n1;n++)//分别赋值到两个数组。 { c[n]=*(p1+n); } for(n=0;n<n2;n++) { d[n]=*(p2+n); } sum(c,d,n1,n2); for(n=0;n<1000;n++)//输出相加结果。 { if((h[n])=='\0') continue; printf("%d",h[n]); } return 0; } void sum(int *a,int *b,int k1,int k2) { int m1,m2,c,n=999; for(m1=k1-1,m2=k2-1;(m1>=0)&&(m2>=0);m1--,m2--,n--)//从个为开始加,当有其中一个数位数加尽了停止循环。 { if(c=(*(a+m1)+*(b+m2)+h[n])>9)//当两个相同位和h数组(即可能上一位进了一)相加大于9时。 { h[n]=c-10;//和为相加和减去10加上本身的值. h[n-1]++; } else h[n]=(*(a+m1)+*(b+m2))+h[n];//如没有大于9则不用减10. while((m1<0)&&(m2>=0))//即当a数组位数小时。 { h[n--]=b[m2--]; } while(m2<0&&m1>=0) { h[n--]=b[m1--]; } } } 这是我的代码上面好像发的的乱了
鱼鱼鱼的记录 2017-12-24
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧