提问人:Virgil G. 提问时间:1/23/2023 更新时间:1/24/2023 访问量:94
在 C 中合并两个整数数组
Merge two integer arrays in C
问:
我正在尝试编写一个函数来合并两个有符号整数数组。这个想法是获取 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
答:
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赞
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;
}
评论
concat
dest[src_size] = eob;
dest[src_size + dest_size] = eob
free(src)
return src;
dest == NULL