C 随记:好用的字符串拼接方法
在 C 语言中,字符串拼接是一个常见的需求,但由于 C 语言本身没有内置的字符串类型,我们需要手动实现字符串拼接功能。本文档介绍了几种实用的 C 语言字符串拼接方法。
方法一:使用 NULL 作为结束标志的可变参数版本
这种方法使用可变参数列表(variadic functions)实现字符串拼接,最后一个参数必须是 NULL 作为结束标志。
c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
char* concat_vargs(const char* first, ...) {
if (!first) {
char* result = malloc(1);
if (result) *result = '\0';
return result;
}
va_list args;
va_start(args, first);
// 计算总长度
size_t total_len = strlen(first);
const char* s;
while ((s = va_arg(args, const char*)) != NULL) {
total_len += strlen(s);
}
va_end(args);
// 分配内存
char* result = malloc(total_len + 1);
if (!result) return NULL;
// 拼接字符串
strcpy(result, first);
va_start(args, first);
while ((s = va_arg(args, const char*)) != NULL) {
strcat(result, s);
}
va_end(args);
return result;
}使用方法:
c
char* result = concat_vargs("Hello", " ", "World", "!", NULL);
printf("%s\n", result); // 输出: Hello World!
free(result); // 记得释放内存方法二:宏包装版本(更方便使用)
这种方法通过宏定义简化了字符串拼接的使用方式,不需要手动添加 NULL 结束标志。
c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
// 内部实现函数
static char* concat_internal(int count, const char** strings) {
if (count <= 0) {
char* result = malloc(1);
if (result) *result = '\0';
return result;
}
// 计算总长度
size_t total_len = 0;
for (int i = 0; i < count; i++) {
total_len += strlen(strings[i]);
}
// 分配内存并拼接
char* result = malloc(total_len + 1);
if (!result) return NULL;
result[0] = '\0';
for (int i = 0; i < count; i++) {
strcat(result, strings[i]);
}
return result;
}
// 使用宏来提供便利的接口
#define CONCAT(...) concat_internal(sizeof((const char*[]){__VA_ARGS__}) / sizeof(const char*), \
(const char*[]){__VA_ARGS__})使用方法:
c
char* str1 = CONCAT("Hello", " ", "World");
char* str2 = CONCAT("The", " ", "answer", " ", "is", " ", "42");
printf("%s\n", str1); // 输出: Hello World
printf("%s\n", str2); // 输出: The answer is 42
free(str1);
free(str2);方法三:完整示例程序
下面是一个完整的示例程序,演示了如何使用可变参数版本的字符串拼接函数:
c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
// 使用NULL结尾的可变参数版本
char* concat_vargs(const char* first, ...) {
if (!first) {
char* result = malloc(1);
if (result) *result = '\0';
return result;
}
va_list args;
va_start(args, first);
// 计算总长度
size_t total_len = strlen(first);
const char* s;
while ((s = va_arg(args, const char*)) != NULL) {
total_len += strlen(s);
}
va_end(args);
// 分配内存
char* result = malloc(total_len + 1);
if (!result) return NULL;
// 拼接字符串
strcpy(result, first);
va_start(args, first);
while ((s = va_arg(args, const char*)) != NULL) {
strcat(result, s);
}
va_end(args);
return result;
}
int main() {
// 示例1:基本使用
char* str1 = concat_vargs("Hello", " ", "World", "!", NULL);
printf("str1: %s\n", str1);
free(str1);
// 示例2:多个字符串拼接
char* str2 = concat_vargs("This", " ", "is", " ", "a", " ", "test", ".", NULL);
printf("str2: %s\n", str2);
free(str2);
// 示例3:只有一个参数
char* str3 = concat_vargs("Single", NULL);
printf("str3: %s\n", str3);
free(str3);
return 0;
}