You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C语言中如何将多个char字符拼接存入字符串buffer中?

C语言动态字符缓冲区追加字符实现方案

你给出的初始代码存在内存越界问题:仅申请了1字节的内存空间,写入buffer[1] = '\0'属于未定义行为,需要先修正初始化逻辑。

核心实现思路

  • 额外维护两个变量:缓冲区当前已使用长度(不含终止符\0)、缓冲区当前总分配容量
  • 每次追加新字符前,判断剩余空间是否足够存储新字符+结尾终止符,不足则调用realloc扩容,通常按当前容量的2倍扩容来降低内存分配开销
  • 追加字符后补加终止符,保证缓冲区始终是合法的C字符串

完整可运行示例代码

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

// 模拟你的read_next_char函数,可替换为实际的字符读取逻辑
char read_next_char() {
    // 示例:返回a-z测试字符,读取结束返回EOF
    static int cnt = 0;
    if (cnt < 26) return 'a' + cnt++;
    return EOF;
}

int main() {
    // 初始缓冲区配置
    size_t buffer_cap = 8; // 初始容量可按需调整,减少扩容次数
    size_t buffer_len = 1; // 初始已用长度,对应第一个字符'h'
    char *buffer = malloc(buffer_cap * sizeof(char));
    if (buffer == NULL) {
        perror("malloc failed");
        return 1;
    }
    buffer[0] = 'h';
    buffer[buffer_len] = '\0';

    char c;
    while ((c = read_next_char()) != EOF) {
        // 判断是否需要扩容:已用长度+1(新字符)+1(终止符) > 总容量
        if (buffer_len + 2 > buffer_cap) {
            size_t new_cap = buffer_cap * 2;
            // 临时变量接收realloc返回值,避免分配失败丢失原buffer地址
            char *temp = realloc(buffer, new_cap * sizeof(char));
            if (temp == NULL) {
                perror("realloc failed");
                free(buffer);
                return 1;
            }
            buffer = temp;
            buffer_cap = new_cap;
        }
        // 执行追加操作
        buffer[buffer_len] = c;
        buffer_len++;
        buffer[buffer_len] = '\0'; // 补终止符保证字符串合法
    }

    // 测试输出
    printf("最终缓冲区内容:%s\n", buffer);

    // 使用完成后释放内存
    free(buffer);
    return 0;
}

注意事项

  • 若你的lexer场景多处理中长字符串,可适当调高初始容量,进一步减少扩容触发次数
  • 禁止直接将realloc返回值赋值给原buffer指针,否则分配失败返回NULL时会丢失原内存地址,引发内存泄漏

内容的提问来源于stack exchange,提问作者user15307601

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:36:03