方法1:使用标准库函数 strcat 和 strcpy
这是最简单的方法,适用于已知目标字符串足够大的情况。
#include <stdio.h>
#include <string.h>
void mergeStrings(const char *str1, const char *str2, char *result) {
strcpy(result, str1); // 复制str1到result
strcat(result, str2); // 将str2追加到result
}
int main() {
char str1[] = "Hello, ";
char str2[] = "world!";
char result[50]; // 确保足够大
mergeStrings(str1, str2, result);
printf("合并后的字符串: %s\n", result);
return 0;
}
说明:
strcpy用于复制第一个字符串。strcat用于追加第二个字符串。- 需要确保
result数组足够大,否则会导致缓冲区溢出。
方法2:手动计算长度并合并
如果不使用 strcpy 和 strcat,可以手动计算字符串长度并合并。
#include <stdio.h>
void mergeStringsManual(const char *str1, const char *str2, char *result) {
int i = 0, j = 0;
// 复制str1到result
while (str1[i] != '\0') {
result[i] = str1[i];
i++;
}
// 追加str2到result
while (str2[j] != '\0') {
result[i + j] = str2[j];
j++;
}
result[i + j] = '\0'; // 添加字符串结束符
}
int main() {
char str1[] = "Hello, ";
char str2[] = "world!";
char result[50];
mergeStringsManual(str1, str2, result);
printf("合并后的字符串: %s\n", result);
return 0;
}
说明:
- 手动遍历字符串并复制字符。
- 最后需要手动添加
'\0'表示字符串结束。
方法3:动态分配内存(更安全)
如果目标字符串长度不确定,可以使用动态内存分配(malloc)来避免缓冲区溢出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* mergeStringsDynamic(const char *str1, const char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
char *result = (char *)malloc(len1 + len2 + 1); // +1 for '\0'
if (result == NULL) {
printf("内存分配失败!\n");
return NULL;
}
strcpy(result, str1);
strcat(result, str2);
return result;
}
int main() {
char str1[] = "Hello, ";
char str2[] = "world!";
char *result = mergeStringsDynamic(str1, str2);
if (result != NULL) {
printf("合并后的字符串: %s\n", result);
free(result); // 释放动态分配的内存
}
return 0;
}
说明:
- 使用
malloc动态分配足够大的内存。 - 使用后必须
free释放内存,避免内存泄漏。
方法4:合并多个字符串(可变参数)
如果需要合并多个字符串,可以使用可变参数函数(如 snprintf)。
#include <stdio.h>
#include <stdarg.h>
char* mergeMultipleStrings(int count, ...) {
va_list args;
va_start(args, count);
// 计算总长度
int total_len = 0;
for (int i = 0; i < count; i++) {
const char *str = va_arg(args, const char*);
total_len += strlen(str);
}
va_end(args);
// 分配内存
char *result = (char *)malloc(total_len + 1);
if (result == NULL) {
printf("内存分配失败!\n");
return NULL;
}
// 合并字符串
va_start(args, count);
int pos = 0;
for (int i = 0; i < count; i++) {
const char *str = va_arg(args, const char*);
strcpy(result + pos, str);
pos += strlen(str);
}
va_end(args);
result[total_len] = '\0';
return result;
}
int main() {
char *result = mergeMultipleStrings(3, "Hello, ", "world", "!");
if (result != NULL) {
printf("合并后的字符串: %s\n", result);
free(result);
}
return 0;
}
说明:
- 使用
va_list处理可变参数。 - 先计算总长度,再分配内存并合并字符串。
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
strcpy + strcat |
已知目标字符串足够大 | 简单直接 | 可能缓冲区溢出 |
| 手动合并 | 不使用标准库函数 | 灵活 | 代码稍长 |
| 动态分配 | 字符串长度不确定 | 安全(避免溢出) | 需要手动 free |
| 可变参数 | 合并多个字符串 | 通用 | 实现较复杂 |
选择合适的方法取决于具体需求,如果只是简单合并两个已知长度的字符串,方法1或方法2即可;如果需要更安全或更灵活的方式,方法3或方法4更合适。
