Один массив копирует данные в 2 других массива, используя указатели C - PullRequest
0 голосов
/ 18 февраля 2019

Я новичок в программировании и переполнении стека, так что простите меня, если я сделаю какие-либо ошибки.У меня есть эта программа, где один массив целых чисел делится на два других массива в зависимости от того, являются ли они больше или меньше, чем введенный пользователем int.Прямо сейчас все меньшие и большие массивы делают, копируют первое целое число независимо от введенного числа. Любые предложения / критические замечания?

/*
  This program will separate an input array into two arrays. One array will be filled by
  elements greater than a specified number and the other array will be filled by elements
  less than the specified number.

*/

#include <stdio.h>

void separate(int *a, int n, 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[length], *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 n = 0, larger[length], smaller[length];
  separate(array, n, value, larger, length_pointer, smaller);

  //Display the arrays
  printf("%d\n", *smaller);
  printf("%d", *larger);

  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 n, int value, int *larger, int *size, int *smaller)
{
  // Delete later *smaller = *larger = *a;
  for(a = &n; a < n + size; a++)
    if(a[n] > value)
    {
      larger = &a[n];
    }
    else if(a[n] <= value)
      smaller = &a[n];

  return;
}

1 Ответ

0 голосов
/ 18 февраля 2019

Я немного изменил ваш код, чтобы достичь вашей цели.Чтобы получить размер массива из пользовательского ввода в 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++;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...