C语言字符串拼接的几种(5种)方法

字符串拼接是将多个字符串合并为一个字符串的操作,字符串拼接在处理文本、构建路径、生成动态消息等任务时非常有用。

字符串拼接是我们开发中常见的需求,下面介绍c语言中几种(5种)字符串拼接的方法,通过例子、函数定义、参数说明,并介绍它们的使用场景和区别。

1. 使用 strcat() 函数

标准库函数,简单易用,下面是例子。

#include <stdio.h>
#include <string.h>

int main() {
    char str1[50] = "online ";
    char str2[] = "compiler!";
    strcat(str1, str2); // 将str2拼接到str1后
    printf("%s\n", str1); // 输出: online compiler!
    return 0;
}
函数定义
char *strcat(char *dest, const char *src); 

参数说明

参数类型说明
destchar*目标字符串(必须有足够的空间存放拼接后的结果)
srcconst char*源字符串(被拼接到 dest 后面)

返回值

返回 dest 的指针(即拼接后的字符串)。

注意:strcat() 不会检查目标缓冲区大小,可能导致溢出,dest 必须有足够的空间容纳拼接后的结果。

2. 使用 strncat() 函数

可指定最大拼接长度,使用起来比strcat()函数更安全,下面是例子。
#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "online ";
    char str2[] = "compiler!";
    strncat(str1, str2, sizeof(str1) - strlen(str1) - 1); // 防止溢出
    printf("%s\n", str1); // 输出: Online compiler!
    return 0;
}

函数定义

char *strncat(char *dest, const char *src, size_t n);
参数说明
参数类型说明
destchar*目标字符串(必须有足够的空间)
srcconst char*源字符串
nsize_t最多拼接的字符数(防止溢出)

返回值

返回 dest 的指针。

与 strcat() 比较:

  • strcat() 更快但不安全
  • strncat() 更安全但需要额外计算

注意:

  • 仍然需要确保 dest 有足够空间
  • 不会检查 dest 和 src 的内存重叠
  • 如果 n 大于 src 的长度,只会复制到 src 的终止符

3. 自定义拼接字符串函数

不使用内置函数,完全控制,适合特殊需求,下面是例子。

#include <stdio.h>

void strcat(char *dest, const char *src) {
    while (*dest) dest++; // 找到dest的结尾
    while (*src) {
        *dest++ = *src++; // 逐个复制字符
    }
    *dest = '\0'; // 添加终止符
}

int main() {
    char str1[50] = "online ";
    char str2[] = "compiler!";
    strcat(str1, str2);
    printf("%s\n", str1); // 输出: online compiler!
    return 0;
} 

4. 使用 sprintf() 或 snprintf()

使用格式化拼接,适合更复杂的字符串表示格式,下面是例子。

#include <stdio.h>

int main() {
    char str1[50] = "online ";
    char str2[] = "compiler!";
    sprintf(str1 + strlen(str1), "%s", str2); // 拼接
    printf("%s\n", str1); // 输出: online compiler!
    return 0;
} 
建议:优先使用 snprintf() 避免溢出。

5. 动态内存分配(malloc + strcpy/strcat)

灵活处理未知长度的字符串,需手动释放内存。

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

int main() {
    char *str1 = "online, ";
    char *str2 = "compiler!";
    char *result = malloc(strlen(str1) + strlen(str2) + 1);
    strcpy(result, str1);
    strcat(result, str2);
    printf("%s\n", result); // 输出: online, compiler!
    free(result); // 释放内存
    return 0;
} 

使用区别和场景

方法 适用场景 安全性 备注
strcat() 已知固定长度 不安全(可能溢出) 仅适用于小字符串
strncat() 需要控制长度 较安全 推荐使用
sprintf() 格式化拼接 可能溢出 适合复杂拼接
snprintf() 安全格式化 安全 最佳选择
自定义函数 学习/优化 需自行管理 适用于嵌入式开发
malloc + strcpy 动态字符串 安全但需手动释放 适合未知长度字符串