合并数组出现的问题

moonclock 2011-11-09 09:19:44
题目要求:
a,b数组都是从小到大排序的,将a数组和b数组中的数,写到c中,c也是从小到大排序的并且要求如果两个数字相同的话,只保留两个相同数字中的一个。

遇到的问题:
代码不能正常的排序,对输出很疑惑。
1 2 4 6 7 8 9 10 12 16 17 18 -858993460 19 29 -858993460 -858993460 1 2 4
请问各位大大,为什么显示输出到18而后出现乱码,又恢复到数组数据,又乱码,又恢复到数组数据,而且是1 2 4这几个数组起始元素呢?

本人菜鸟,请各位大大帮忙解释一下这个问题了~万分感激!

本人的菜鸟代码:

#include <stdio.h>

int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[20] = {0};
int ACount = 0; //a数组中的位置
int BCount = 0; //b数组中的位置
int CCount = 0;

for(int k = 0; k < 20; k++)
{
if(a[ACount] < b[BCount])
{
c[CCount++] = a[ACount++];
continue;
}
else if(a[ACount] == b[BCount])
{
c[CCount++] = a[ACount++];
BCount++;
continue;
}
else
{
c[CCount++] = b[BCount++];
continue;
}
}
for(int i = 0; i < 20; i++)
printf("%d ",c[i]);
return 0;
}


...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
moonclock 2011-11-09
  • 打赏
  • 举报
回复
谢谢大家了,问题已解决。

输出19,29后b数组也溢出,导致溢出数组外~

感谢lijy520,感谢大家~
金元520 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhaopeng2511 的回复:]
个人方法:可作参考


C/C++ code
#include <stdio.h>
#define M 10
#define N 10
void main(void)
{
int a[M] = {1,2,4,7,8,9,10,12,16,18};
int b[N] = {1,2,6,7,8,9,10,17,19,29};
int c[50];
……
[/Quote]

正解,不过使用时小心运算符优先级问题.
建议加() 增加可读性
金元520 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 moonclock 的回复:]
引用 1 楼 we_sky2008 的回复:

C/C++ code

int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[sizeof(a) / sizeof(a[0]) + sizeof(b) / sizeof(b[0])];
int ……
[/Quote]

a越界后会抓他后面的那个内存中的数据
最后的124是数组可能是a的数据(或者随机.看系统内存分配)
你C中根本没有20个
打印的时候为什么还要打20个
运行跟踪一下内存就知道了

这题主要错误原因:
1.a,b是否结束未判定
2.数组大小不明确,最后打印时应以CCount准
moonclock 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 we_sky2008 的回复:]

C/C++ code

int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[sizeof(a) / sizeof(a[0]) + sizeof(b) / sizeof(b[0])];
int ACount = 0; ……
[/Quote]

谢谢,还有一个问题想请教,当数组a越界以后,-858993460是?1 2 4最后是为什么会输出呢?该不会是ACount的值改变了吧?
moonclock 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a707000646 的回复:]

我也是这么做的,主要是你的判断有错误
2个数组同时操作的时候,数组A越界了,因为a为10的时候你没有跳出循环
所以错了
另外就是 你不能判断数组是否已经读完了
所以后面再加
while (ACount != sizeof(a) / sizeof(a[0]))
{
c[CCount++] = a[ACount++];
}
while (B……
[/Quote]
谢谢,可是到了输出的最后为什么会出现1 2 4这几个a数组的其实元素?
zhaopeng2511 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 we_sky2008 的回复:]
C/C++ code

int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[sizeof(a) / sizeof(a[0]) + sizeof(b) / sizeof(b[0])];
int ACount = 0……
[/Quote]


感觉sizeof(a)应改成sizeof(a)/4
zhaopeng2511 2011-11-09
  • 打赏
  • 举报
回复
数组c定义为c[M+N]更合理些……
zhaopeng2511 2011-11-09
  • 打赏
  • 举报
回复
个人方法:可作参考

#include <stdio.h>
#define M 10
#define N 10
void main(void)
{
int a[M] = {1,2,4,7,8,9,10,12,16,18};
int b[N] = {1,2,6,7,8,9,10,17,19,29};
int c[50];
int i=0,j=0,k=0;
while(i<M||j<N)
if(i<M&&j<N)
c[k++]=a[i]<b[j]?a[i++]:a[i]==b[j]?j++,a[i++]:b[j++];
else if(i>=M)
c[k++]=b[j++];
else
c[k++]=a[i++];
for(i=0;i<k;i++)
printf("%d ",c[i]);
}
a707000646 2011-11-09
  • 打赏
  • 举报
回复
我也是这么做的,主要是你的判断有错误
2个数组同时操作的时候,数组A越界了,因为a为10的时候你没有跳出循环
所以错了
另外就是 你不能判断数组是否已经读完了
所以后面再加
while (ACount != sizeof(a) / sizeof(a[0]))
{
c[CCount++] = a[ACount++];
}
while (BCount != sizeof(b) / sizeof(b[0]))
{
c[CCount++] = b[BCount++];
}
把剩下的复制到C中
[Quote=引用 1 楼 we_sky2008 的回复:]
C/C++ code

int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[sizeof(a) / sizeof(a[0]) + sizeof(b) / sizeof(b[0])];
int ACount = 0……
[/Quote]
wd379033001 2011-11-09
  • 打赏
  • 举报
回复
int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[sizeof(a) / sizeof(a[0]) + sizeof(b) / sizeof(b[0])];
int ACount = 0; //a数组中的位置
int BCount = 0; //b数组中的位置
int CCount = 0;

while (ACount != sizeof(a) / sizeof(a[0]) && BCount != sizeof(b) / sizeof(b[0]))
{
if(a[ACount] < b[BCount])
{
c[CCount++] = a[ACount++];
}
else if(a[ACount] == b[BCount])
{
c[CCount++] = a[ACount++];
BCount++;
}
else
{
c[CCount++] = b[BCount++];
}
}
while (ACount != sizeof(a) / sizeof(a[0]))
{
c[CCount++] = a[ACount++];
}
while (BCount != sizeof(b) / sizeof(b[0]))
{
c[CCount++] = b[BCount++];
}
for(int i = 0; i < CCount; i++)
printf("%d ",c[i]);


system("pause");
return 0;
}
we_sky2008 2011-11-09
  • 打赏
  • 举报
回复

int main(void)
{
int a[] = {1,2,4,7,8,9,10,12,16,18};
int b[] = {1,2,6,7,8,9,10,17,19,29};
int c[sizeof(a) / sizeof(a[0]) + sizeof(b) / sizeof(b[0])];
int ACount = 0; //a数组中的位置
int BCount = 0; //b数组中的位置
int CCount = 0;

while (ACount != sizeof(a) / sizeof(a[0]) && BCount != sizeof(b) / sizeof(b[0]))
{
if(a[ACount] < b[BCount])
{
c[CCount++] = a[ACount++];
}
else if(a[ACount] == b[BCount])
{
c[CCount++] = a[ACount++];
BCount++;
}
else
{
c[CCount++] = b[BCount++];
}
}
while (ACount != sizeof(a) / sizeof(a[0]))
{
c[CCount++] = a[ACount++];
}
while (BCount != sizeof(b) / sizeof(b[0]))
{
c[CCount++] = b[BCount++];
}
for(int i = 0; i < CCount; i++)
printf("%d ",c[i]);


system("pause");
return 0;
}

69,369

社区成员

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

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