C - 如何从数组中提取偶数并将它们放入另一个名为EvenNumbers的数组中?

时间:2017-04-30 13:36:39

标签: c arrays function

我的任务是编写一个函数,该函数将识别样本数组{10,2,9,3,1,98,8]中的所有偶数,并将它们放在一个名为EvenNumbers的数组中。我必须允许该函数,以便它可以使用数组中不同数字组合而不仅仅是上面示例数组中的数字。

我想知道有没有办法将数字添加到每次可能不同的数组?如何将偶数提取到一个数组中?也 对于偶数数组大小,它给我一个错误,表达式必须有一个常量值但是当我使用const int时它仍然给我这个错误。

以下是完整的问题。

"使用样本值数组{10,2,9,3,1,98,8},编写一个函数,识别数组中的所有偶数,并将其放在一个名为EvenNumbers的数组中。该函数必须在所有情况下都有效,而不仅仅是在显示的数组的情况下。假设数组大小始终通过名为MAX"

的全局常量可用

这是我到目前为止所拥有的。我不知道如何从for循环中提取偶数并将它们放在数组中。我也不知道"表达式必须具有恒定值"是关于?

#include <stdio.h>
#include <stdlib.h>

void EvenNumber(int Array[], int size);

int main()
{
int array[7] = { 10,2,9,3,1,98,8 };

EvenNumber(array, 7);
}

void EvenNumber(int Array[], int size)
{
int i;
int EvenArraySize;
for (i = 0; i < size; i++)
{

    if (Array[i] % 2 == 0)
    {
        EvenArraySize++;

    }

}

int Even[EvenArraySize];

}

2 个答案:

答案 0 :(得分:0)

正确的方法是使用malloc分配恰当的内存量。

  1. 计算偶数的数量
  2. 分配存储它们所需的空间
  3. 在此空间中复制偶数数字
  4. 用这些数字做任何你想做的事
  5. 释放分配的空间
  6. 段:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 7
    
    int
    main()
    {
      int array[] = {10,2,9,3,1,98,8};
      int *even_numbers;
      int i, nb_even_numbers;
    
      for (i = 0, nb_even_numbers = 0; i < MAX; i++)
        {
          if (array[i] % 2 == 0)
            nb_even_numbers++;
        }
      even_numbers = malloc(sizeof(int) * nb_even_numbers);
      if (!even_numbers)
        {
          perror("malloc");
          return 1;
        }
      for (i = 0, nb_even_numbers = 0; i < MAX; i++)
        {
          if (array[i] % 2 == 0)
            even_numbers[nb_even_numbers++] = array[i];
        }
      /* do your stuff here */
      free(even_numbers);
      return 0;
    }
    

答案 1 :(得分:0)

首先,你永远不能从一个函数返回一个静态声明的数组(即使你没有明确地尝试,Even数组在EvenNumber返回时被销毁)为什么? EvenNumber的函数堆栈框架被释放以便在返回时重用,并且任何本地声明的数组都不再有效。

您需要将第二个数组作为参数传递给EvenNumber,或者您可以在Even中为EvenNumber动态分配存储空间(例如malloc或{ {1}}或calloc)并返回指向数组开头的指针。 (你还必须有一些方法来返回大小或使用常量来获得最大大小)。

无需使用realloc%)来测试数字是奇数还是偶数。您需要做的就是查看modulo(小端)。如果是bit-0,则数字奇数,如果是0,则其甚至。比调用包含除法的模数更有效。

最后,1main类型,因此会返回一个值。

将这些部分放在一起,你可以做一些简单的事情,如下所示:

int

注意: #include <stdio.h> #include <stdlib.h> void EvenNumber (int *array, int *even, int size, int *esize); int main (void) { int array[] = { 10,2,9,3,1,98,8 }, i, n = sizeof array / sizeof *array, even[n], /* a VLA of the same size as array is fine here */ esize = 0; EvenNumber (array, even, n, &esize); printf ("array: "); for (i = 0; i < n; i++) printf (" %2d", array[i]); printf ("\neven : "); for (i = 0; i < esize; i++) printf (" %2d", even[i]); putchar ('\n'); return 0; } void EvenNumber (int *array, int *even, int size, int *esize) { int i; for (i = 0; i < size; i++) if ((array[i] & 1) == 0) /* simply looking at bit-0 is all you need */ even[(*esize)++] = array[i]; } 作为指向esize的指针传递,并在函数内更新,以便EvenNumber中的元素数量可用于调用函数(even这里)。

示例使用/输出

main()

如果您有任何其他问题,请与我们联系。