和C多项列表拼接

作者:技术拾光

时间:2026-06-02

浏览:114

C语言中数组拼接需手动实现,常用memcpy分段拷贝、指针偏移循环赋值、malloc动态分配及strcat/snprintf字符串专用拼接。 在C语言开发中,你无法像Python那样直接使用list1 + list2拼接数组,也找不到JavaScript中现成的concat()方法。然而,实际编程中

文章目录
C语言中数组拼接需手动实现,常用memcpy分段拷贝、指针偏移循环赋值、malloc动态分配及strcat/snprintf字符串专用拼接。

和C多项列表拼接

在C语言开发中,你无法像Python那样直接使用list1 + list2拼接数组,也找不到JavaScript中现成的concat()方法。然而,实际编程中经常需要将多个数组的内容按顺序合并到一起。解决这个问题的核心要点有三个:明确待拼接的数据类型、每个数组的长度以及在内存中的布局,然后手动将这些数据“搬运”到目标位置。

使用 memcpy 分段拷贝:最常用的方式

这是最直接且效率较高的方法,适合已知源数组地址和长度的场景。操作时需要注意以下几点:

  • 首先,确保目标缓冲区有足够空间容纳所有数据,总长度必须大于或等于所有源数组长度之和。
  • 然后,依次调用memcpy复制每一段。每复制完一段,目标起始地址需向后移动,即累加已写入的字节数。
  • 重要提示:memcpy不会检查内存区域是否重叠。如果源数据和目标区域可能重叠,应改用更安全的memmove。

以下示例拼接三个整型数组:

int a[] = {1, 2};
int b[] = {3, 4, 5};
int c[] = {6};
int result[6]; // 总长度 2+3+1 = 6

memcpy(result,     a, sizeof(a));
memcpy(result+2,   b, sizeof(b));
memcpy(result+5,   c, sizeof(c));

指针偏移加循环赋值:更灵活的选择

如果在拼接过程中需要进行额外处理(例如只选取正数、转换大小写等),这种方法更加灵活。

  • 使用一个目标指针(如int *out = result;)跟踪当前写入位置。
  • 遍历每个源数组,对每个元素进行判断或转换后赋值给*out,同时将指针out后移。
  • 这种方式避免硬编码下标,逻辑清晰,便于后续扩展功能。

动态拼接需借助 malloc / realloc

当源数组数量或长度在运行时才能确定(例如解析配置文件获得多段数据)时,静态数组无法满足需求,必须使用动态内存分配。

  • 通常先遍历所有源数据,计算出总长度。
  • 然后使用malloc分配一块大小恰好等于总长度的目标内存。
  • 最后执行拷贝操作,方法与第一种memcpy分段拷贝相同。
  • 如果后续需要向结果追加数据,可考虑用realloc扩容。注意realloc可能移动原有数据块,之前保存的指针可能失效。

字符串拼接推荐 strcat 或 snprintf

对于C语言中以\0结尾的字符串,标准库提供了专用工具,使用起来更为便捷。

  • strcat(dest, src):最简单,直接将src接到dest末尾。缺点是不检查dest容量,容易导致缓冲区溢出,存在安全隐患。
  • strncat(dest, src, n):更安全的版本,可限制最多拼接n个字节。
  • snprintf(buf, size, "%s%s%s", s1, s2, s3):推荐在可控场景中使用。它能一次性格式化拼接多个字符串,并自动截断以防止越界,最后自动补上字符串结束符\0。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›