在 C 中合并两个整数数组

Merge two integer arrays in C

提问人:Virgil G. 提问时间:1/23/2023 更新时间:1/24/2023 访问量:94

问:

我正在尝试编写一个函数来合并两个有符号整数数组。这个想法是获取 src 的内容,在 dest 中重新分配内存以在其自己的内容之后插入 src 的内容。如果 dest 为 NULL,则函数必须分配内存空间来存储 src + 1。如果出现错误,该函数必须返回 NULL。该函数还必须在合并后释放分配给 src 的内存空间。整数数组由一个名为“End Of Buffer”的 int 终止(在下面的示例中为 -1)。

问题似乎与 realloc 功能有关,你能帮我修复它吗?

以下是产生错误的完整代码:

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

ssize_t my_put_int(int nbr, int fd)
{
    char c = 0;
    char negative = '-';
    ssize_t len = 0;
    if (nbr < 0) {
        len += write(fd, &negative, 1);
        len += my_put_int(-nbr, fd);
    } else if (nbr < 10) {
        c = nbr + 48;
        len += write(fd, &c, 1);
    } else {
        len += my_put_int(nbr / 10, fd);
        c = nbr % 10 + 48;
        len += write(fd, &c, 1);
    }
    return len;
}

ssize_t my_put_int_arr(int *arr, int eob, int fd)
{
    size_t count = 0;
    int *ptr = NULL;
    if (!arr || fd < 0)
        return -1;
    ptr = arr;
    while (*ptr != eob) {
        count += my_put_int(*ptr, fd);
        ptr++;
    }
    return count;
}

size_t my_int_arr_len(int *arr, int eob)
{
    size_t count = 0;
    if (!arr)
        return -1;
    while (*arr != eob) {
        count++;
        arr++;
    }
    return count;
}

int *my_int_array_concat(int *dest, int *src, int eob)
{
    size_t src_size = 0, dest_size = 0;
    if (!src) return NULL;
    src_size = my_int_arr_len(src, eob);
    if (dest == NULL) {
        dest = malloc(sizeof(int) * (src_size + 1));
        if (dest == NULL) return NULL;
        for (size_t i = 0; i < src_size; i++) dest[i] = src[i];
        dest[src_size] = eob;
        free(src);
        return dest;
    }
    dest_size = my_int_arr_len(dest, eob);
    printf("Dest size %ld, src size %ld\n", dest_size, src_size);       // Debug
    dest = realloc(dest, sizeof(int) * (dest_size + src_size + 1));
    printf("New dest size %ld\n", my_int_arr_len(dest, -1));            // Debug
    if (!dest) return NULL;
    for (size_t i = 0; i < src_size; i++) dest[i] = src[i];
    dest[src_size] = eob;
    free(src);
    return dest;
}

int main()  //test main
{
    int *src = malloc(sizeof(int) * 2);
    src[0] = 3;
    src[1] = -1;
    int *dest = malloc(sizeof(int) * 3);
    dest[0] = 2;
    dest[1] = 1;
    dest[2] = -1;
    dest = my_int_array_concat(dest, src, -1);
    my_put_int_arr(dest, -1, 1);
    return 0;
}

我得到这个结果:

Dest size 2, src size 1
New dest size 2
3
c 整数 malloc

评论

0赞 cafce25 1/23/2023
从终点线开始的第 3 个应该是吗?concatdest[src_size] = eob;dest[src_size + dest_size] = eob
0赞 cafce25 1/23/2023
另外:既然您可以,不如只在案例中复制数据。free(src)return src;dest == NULL

答:

0赞 Ashutosh Pandey 1/23/2023 #1

使用以下 concat 函数 -

int *my_int_array_concat(int *dest, int *src, int eob)
{
    size_t src_size = 0, dest_size = 0;
    if (!src) return NULL;
    src_size = my_int_arr_len(src, eob);
    if (dest == NULL) {
        dest = malloc(sizeof(int) * (src_size + 1));
        if (dest == NULL) return NULL;
        for (size_t i = 0; i < src_size; i++) dest[i] = src[i];
        dest[src_size] = eob;
        return dest;
    }
    dest_size = my_int_arr_len(dest, eob);
    dest = realloc(dest, sizeof(int) * (dest_size + src_size + 1));
    if (!dest) return NULL;
    for (size_t i = 0; i < src_size; i++) dest[dest_size+i] = src[i];
    dest[dest_size+src_size] = eob;
    free(src);
    return dest;
}

它应该起作用。

评论

0赞 Community 1/23/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 mystackoverflowpseudo 1/23/2023 #2

这是该函数的另一个(未测试的)变体:

int* my_int_array_concat( int* dst, int* src, int eob )
{
    int* result;
    int  dst_size;
    int  src_size;
    int  elements_count;

    src_size = my_int_arr_len( src, eob );
    if( src_size == -1 )
        src_size = 0;

    dst_size = my_int_arr_len( dst, eob );
    if( dst_size == -1 )
        dst_size = 0;

    elements_count =  src_size + dst_size;

    result = realloc( dst, sizeof(int) * (elements_count + 1) );
    if( result == NULL )
        return NULL;

    if( src_size )
        memcpy( result + dst_size, src, sizeof(int) * src_size );

    result[elements_count] = eob;

    if( src )
        free( src );

    return result;
}