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