字符串拼接是将多个字符串合并为一个字符串的操作,字符串拼接在处理文本、构建路径、生成动态消息等任务时非常有用。
字符串拼接是我们开发中常见的需求,下面介绍c语言中几种(5种)字符串拼接的方法,通过例子、函数定义、参数说明,并介绍它们的使用场景和区别。
标准库函数,简单易用,下面是例子。
#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);
参数说明
参数 | 类型 | 说明 |
---|---|---|
dest | char* | 目标字符串(必须有足够的空间存放拼接后的结果) |
src | const char* | 源字符串(被拼接到 dest 后面) |
返回值
返回 dest 的指针(即拼接后的字符串)。
注意: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);
参数说明参数 | 类型 | 说明 |
---|---|---|
dest | char* | 目标字符串(必须有足够的空间) |
src | const char* | 源字符串 |
n | size_t | 最多拼接的字符数(防止溢出) |
返回值
返回 dest 的指针。
不使用内置函数,完全控制,适合特殊需求,下面是例子。
#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;
}
使用格式化拼接,适合更复杂的字符串表示格式,下面是例子。
#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() 避免溢出。灵活处理未知长度的字符串,需手动释放内存。
#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 | 动态字符串 | 安全但需手动释放 | 适合未知长度字符串 |