一个数组使用C指针将数据复制到其他2个数组

时间:2019-02-17 22:00:48

标签: c arrays pointers

我是编程和堆栈溢出的新手,所以如果我犯任何错误,请原谅我。我有一个程序,该程序将一个int数组分为两个其他数组,具体取决于它们是大于还是小于用户输入的int。现在,无论大小如何,所有较小和较大的数组都将复制第一个整数,而与输入的数字无关。有什么建议/批评吗?

Flux.merge

1 个答案:

答案 0 :(得分:0)

我对您的代码做了一些修改,以实现您的目标。为了在C99下从用户输入中获取数组大小,您需要动态分配它,例如在程序运行时按calloc(elements_number,element_size_in_bytes)调用。不要忘记释放分配的内存,以避免内存泄漏。如下所示:

int* array = calloc(user_input, sizeof(int));
...
//some code
...
free(array);

您单独的功能看起来有点复杂。这部分是错误的:

for(a = &n; a < n + size; a++)

您在这里所做的是将 a 指向整数 n a 不再指向源数组。因此,在 a &n 时拨打 a [n] 之类的电话就像(&n)[n] n 也不更改值,因为将指针增加到 n 而不是它指向的值。

接下来,如果要显示数组元素,请使用循环,就像我在下面所做的那样。

在单独的函数中找不到n参数的用途。我将它用作较大数组中的实际元素数量,因此不必打印所有元素。

我希望这个答案能满足您的期望。

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

void separate(int *a, int *larger_count, int value, int *larger, int size, int *smaller);

int main()
{

    //Find size of array
    int length;
    int *length_pointer = &length;
    printf("Enter the length of the array: ");
    scanf("%d", length_pointer);

    //Enter array elements
    int*array = calloc(*length_pointer, sizeof(int));
    int*p;
    printf("Enter %d numbers: ", length);
    for(p = array; p < array + length; p++)
        scanf("%d", p);

    //Find separating value
    int value;
    printf("Enter the number to split the array: ");
    scanf("%d", &value);

    //Declare arrays and call function
    int *larger = calloc(*length_pointer, sizeof(int));
    int *smaller = calloc(*length_pointer, sizeof(int));
    int larger_count = 0;
    separate(array, &larger_count, value, larger, length, smaller);

    for (int i = 0 ; i < larger_count ; ++i)
    {
        printf("%d ", larger[i]);
    }
    printf("\n");

    for (int i = 0 ; i < length - larger_count; ++i)
    {
        printf("%d ", smaller[i]);
    }
    printf("\n");

    free(array);
    free(larger);
    free(smaller);
    return 0;
}

/*************************************************************************************
  separate finds numbers larger than value in array a and stores them in array larger.
  Numbers smaller than or equal to value will be stored in the smaller array.
  size points to a variable in which the function will store the number of larger
  numbers in the array.
*************************************************************************************/
void separate(int *a, int *larger_count, int value, int *larger, int size, int *smaller)
{
    for(int x = 0, y = 0, z = 0; x < size; x++)
    {
        if (a[x] > value)
        {
            larger[y] = a[x];
            y++;
            *larger_count = y;
        } else
        {
            smaller[z] = a[x];
            z++;
        }
    }
}