c-如何返回只有偶数/奇数的数组并删除不必要的单元格



我试图从用户那里获得一个数组、一个数字和is_even bool变量,并只返回一个偶数新数组,否则只返回奇数数组,具体取决于is_even。例如:数组{1,2,3,4}和is_even=1将返回{2,4},如果is_even=0,则返回的数组将为{1,3}当我得到它时,我应该在将数组传递给函数之前动态地分配它。到目前为止我所做的是

我被退货卡住了。我检查了p指向的内容是偶数还是奇数,但如何擦除单元格?

#include <stdio.h>
#include <malloc.h>
int *new_array(int *p,int number,int is_even){
int j,i=0;
int counter=0;
if(is_even){
for(j=0;j<number;j++){
if(*(p+j)%2==0){
}
}
return p;
}
}

void main() {
int n,i,is_even;
int *p;
printf("enter number of elements");
scanf("%d",&n); rewind(stdin);
printf("hoose is_even 1 or 0");
scanf("%d",&is_even);rewind(stdin);
p=(int *)malloc(n* sizeof(int));
for(i=0;i<n;i++){
scanf("%d",p+i);
}
p=new_array(p,n,is_even);
for(i=0;i<n;i++){
printf("%4d",*(p+i));
}
}

问题的一部分是,您没有考虑到需要传达给调用者的信息之一:返回数组中的有效整数数。打印循环假设的元素数量与最初读取的元素数量相同,但根据函数的性质,通常会过多。

你问,

如何擦除单元格?

,但"擦除"不是你能做的事。你可以用不同的值覆盖数组元素,但你不能让单个数组元素停止存在,尤其是不能从数组的中间开始。通常的习惯用法是将要保留的元素放在原始数组或新数组的初始元素中,并返回元素数量。在新数组的情况下,还必须返回指向(动态分配的)数组的指针。您提供的函数签名是不够的,因为它没有提供返回元素计数的好方法。

有很多方法可以解决这个问题。一个简单的方法是将number作为输入/输出参数,方法是将指针传递给元素数,而不是元素数值:

int *new_array(int *p, int *number, int is_even) {
// ... 'j' keeps a running count of the number of is_even elements
*number = j;  // Write the final number of elements back to the caller
return p;     // return the allocated array
}

实现的细节需要进行一些更改,以适应number参数的类型和用法的变化,并修复错误。

你可以这样称呼它:

p = new_array(p, &n, is_even);

然后继续,就像你已经在做的一样。

您可以将所有偶数/奇数放在数组的开头,realloc()数组的新大小,并在返回中返回其新长度的值。但是您需要您的函数来接收(int**数组),以便更改数组的指针

因此函数声明可以是int new_array(int**p,int number,int is_even)

问题不是删除单元格,问题是当你删除它们时,数组的长度不再相同。。

顺便说一句,您还可以更改长度值,并使用int*new_array(int*p,int*number,int is_even)为新数组返回new add

最新更新