Как я могу объединить два целочисленных массива в C с циклами for - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь объединить два массива, но, похоже, проблема.Я пытаюсь использовать простой цикл, но он не работает.Моя первая проблема заключается в том, что я не знаю, как остановить цикл for для массива, а во-вторых, каждый раз, когда он присваивает какое-либо значение мусора объединенному массиву.Если бы кто-то мог просто дать мне направление ...

int arr1[] = {1,2,3,4,5,0}, arr2[] = {6,7,8,9,0};

int x = 0, merge_arr[x], i = 0, x1 = 0;

for( ; arr1[i] != 0; i++)
{
    merge_arr[i] = arr1[i];
    printf("%di ", merge_arr[i]);
}

for( ; arr2[x1] != 0; i++)
{
    merge_arr[i] = arr2[x1];
    printf(" %di ", merge_arr[i]);
    x1++;
}

for(int x2 = 0; merge_arr[x2] != '\0'; x2++)
{
    printf("%d\n", merge_arr[x2]);
}

1 Ответ

1 голос
/ 29 июня 2019

Поскольку C является процедурным языком, полезно определить функции для таких операций.Стандарт C предусматривает специальный тип size_t для размеров.

int *concatIntArrays(int *dest, size_t maxSize, const int *arr1, const size_t arr1Size, const int *arr2, const size_t arr2Size)
{
    size_t toCopy;
    if(!dest)
    {
        dest = malloc(maxSize ? maxSize * sizeof(*dest) : (maxSize = (arr1Size + arr2Size)) * sizeof(*dest));
    }
    if(dest)
    {
        if(arr1Size <= maxSize) toCopy = arr1Size;
        else toCopy = maxSize;
        memcpy(dest, arr1, toCopy * sizeof(*dest));

        maxSize -= toCopy;

        if(arr2Size <= maxSize) toCopy = arr2Size;
        else toCopy = maxSize;
        memcpy(dest + arr1Size, arr2, toCopy * sizeof(*dest));
    }
    return dest;
}

или более общий:

void *concatArrays(void *dest, const size_t elemSize, size_t maxSize, const void *arr1, const size_t arr1Size, const void *arr2, const size_t arr2Size)
{
    size_t toCopy;
    char *tempdest = dest;
    if(!dest)
    {
        dest = malloc(maxSize ? maxSize * elemSize : (maxSize = (arr1Size + arr2Size)) * elemSize);
    }
    if(dest)
    {
        if(arr1Size <= maxSize) toCopy = arr1Size;
        else toCopy = maxSize;
        memcpy(dest, arr1, toCopy * elemSize);

        maxSize -= toCopy;

        if(arr2Size <= maxSize) toCopy = arr2Size;
        else toCopy = maxSize;
        memcpy(tempdest + arr1Size * elemSize, arr2, toCopy * elemsize);
    }
    return dest;
}

, где все размеры указаны в элементах.elemSize в байтах.

Вы можете передать свой собственный буфер (целевой массив) или NULL - тогда функция выделит его для вас.Если maxSize равен нулю, он выделяет столько памяти, сколько необходимо для размещения обоих массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...