返回信息流有序数组 int a[]={1,3,5,7,9,11}; int b[]={2,4,6,8,10};
希望经过int* unionArray(int a[],int b[],int alen,int blen)函数后返回排好序的c数组,结果总是不对,为什么哦?
谢谢!!
//ArrayUnion
#include <stdio.h>
#include <stdlib.h>
void printArray(int c[],int len);
int* unionArray(int a[],int b[],int alen,int blen){
printArray(a,alen);
printArray(b,blen);
int clen=alen+blen;
int temp[clen];
int *c=temp;
//int c[clen];
//c[1]=1;
printf("clen=%d\n",clen);
int i=0,j=0,k=0;
while(i<alen && j<blen){
if(a[i]<=b[j]){
c[k]=a[i];
i++;
k++;
printf("c[%d]=%d\n",k,c[k]);
}else{
c[k]=b[j];
j++;
k++;
printf("c[%d]=%d\n",k,c[k]);
}
}
while(i<alen){
c[k]=a[i];
k++;
i++;
printf("c[%d]=%d\n",k,c[k]);
}
while(j<blen){
c[k]=b[j];
k++;
i++;
printf("c[%d]=%d\n",k,c[k]);
}
//return c;
}
void printArray(int c[],int len){
for(int i=0;i<len;i++){
printf("%d;",c[i]);
}
printf("\n");
}
int main(){
int a[]={1,3,5,7,9,11};
int b[]={2,4,6,8,10};
int alen=sizeof(a)/sizeof(a[0]);
int blen=sizeof(b)/sizeof(b[0]);
printf("alen=%d, blen=%d\n",alen,blen);
//int clen=alen+blen;
int *c=unionArray(a,b,alen,blen);
int clen=sizeof(c)/sizeof(int);
printf("clen=%d\n",clen);
printArray(c,clen);
getchar();
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #9026同步于 2008/6/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
数组合并问题,函数返回值为指向数组的指针,如何得到其长度?
heartremain
2008/6/30镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
#include <stdio.h>
#include <stdlib.h>
void printArray(int c[],int len);
int* unionArray(int a[],int b[],int alen,int blen){
printArray(a,alen);
printArray(b,blen);
int clen=alen+blen;
int temp[clen]; //这里不能这么定义,或者用new,或者定义一个常量长度
int *c=temp;
//int c[clen];
//c[1]=1;
printf("clen=%d\n",clen);
int i=0,j=0,k=0;
while(i<alen && j<blen){
if(a[i]<=b[j]){
c[k]=a[i];
i++;
k++;
printf("c[%d]=%d\n",k,c[k]); //这个应该在i++;k++之前打印
}else{
c[k]=b[j];
j++;
k++;
printf("c[%d]=%d\n",k,c[k]); //同样,这个应该在i++;k++之前打印
}
}
while(i<alen){
c[k]=a[i];
k++;
i++;
printf("c[%d]=%d\n",k,c[k]); //同样,这个应该在i++;k++之前打印
}
while(j<blen){
c[k]=b[j];
k++;
i++;
printf("c[%d]=%d\n",k,c[k]); //同样,这个应该在i++;k++之前打印
}
//return c; //这里需要有返回值
}
void printArray(int c[],int len){
for(int i=0;i<len;i++){
printf("%d;",c[i]);
}
printf("\n");
}
int main(){
int a[]={1,3,5,7,9,11};
int b[]={2,4,6,8,10};
int alen=sizeof(a)/sizeof(a[0]);
int blen=sizeof(b)/sizeof(b[0]);
printf("alen=%d, blen=%d\n",alen,blen);
//int clen=alen+blen;
int *c=unionArray(a,b,alen,blen);
int clen=sizeof(c)/sizeof(int);
printf("clen=%d\n",clen);
printArray(c,clen);
getchar();
}
最重要的一个错误是你在函数unionArray声明了一个数组temp,这个数据局部变量,在栈中分配空间,等从函数返回的时候这个就丢失了,所以后面的计算长度和打印就都不对了
【 在 zmsong 的大作中提到: 】
: #include <stdio.h>
: #include <stdlib.h>
:
: ...................
他没在函数外部使用这个局部变量
lz的问题在于他用 sizeof(c)/sizeof(int)来处理
在调用合并排序函数的时候返回值你声明的c是一个int *,所以sizeof(c) = 4
最好的方式是用一个指针参数把clen带出来
【 在 colprog 的大作中提到: 】
: 没仔细看,但是
: int temp[clen]
: 是可以的,这是c99标准加入的一项新特性。虽然vc不支持……
: ...................
solaris下CC也不支持,为了兼容性还是不用为好
【 在 rebirthatsix 的大作中提到: 】
: 他没在函数外部使用这个局部变量
: lz的问题在于他用 sizeof(c)/sizeof(int)来处理
: 在调用合并排序函数的时候返回值你声明的c是一个int *,所以sizeof(c) = 4
: ...................
RE
clen=alen+blen......
【 在 heartremain 的大作中提到: 】
: 有序数组 int a[]={1,3,5,7,9,11}; int b[]={2,4,6,8,10};
: 希望经过int* unionArray(int a[],int b[],int alen,int blen)函数后返回排好序的c数组,结果总是不对,为什么哦?
: 谢谢!!
: ...................
多谢指正,呵呵,我就纳闷我的合并算法怎么会错呢,
这样打印果然就对了。
十分感谢~~
【 在 zmsong 的大作中提到: 】
: #include <stdio.h>
: #include <stdlib.h>
:
: ...................