【问题标题】:How can I merge two integer arrays in C with for loops如何将 C 中的两个整数数组与 for 循环合并
【发布时间】:2019-06-29 15:41:28
【问题描述】:

我正在尝试合并两个数组,但似乎有问题。我尝试使用一个简单的循环,但它不起作用。我的第一个问题是我不知道如何停止数组的 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]);
}

【问题讨论】:

  • int x = 0 , merge_arr[x] - 你刚刚声明了一个大小为 0 的数组。这应该如何工作?
  • 您的“合并”似乎是“将arr1 然后arr2 连接到结果数组中”,并增加了“在源数组中的第一个零元素处停止复制”的皱纹。很多时候,合并意味着“交错源数组的元素(按排序顺序),以便结果数组也按排序顺序”。这需要非常不同的代码。

标签: c arrays for-loop


【解决方案1】:

由于 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 为零,它会根据需要分配尽可能多的内存来容纳两个数组。

【讨论】:

    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2020-10-13
    • 2023-01-23
    相关资源
    最近更新 更多