Skip to content

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;
}

最后编辑时间:

Version 4.3