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

C语言如何为控制台输入的单词分配恰好大小的字符数组内存

C语言动态适配输入长度的字符串读取实现

核心思路

C标准库没有自带安全读取任意长度字符串的内置函数,我们可以通过「初始缓冲区+动态扩容+最终缩容」的逻辑实现需求,完全适配输入内容的内存占用,不会浪费多余空间:

  • 先在堆上申请一块较小的初始内存作为输入缓冲区
  • 从控制台逐个读取字符存入缓冲区,缓冲区剩余空间不足时自动扩容
  • 读取结束后将内存缩容到刚好能存储输入内容 + 字符串终止符\0的大小

完整实现代码

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

char* read_dynamic_string() {
    int init_size = 16; // 初始缓冲区大小,可自行调整
    char* buf = (char*)malloc(init_size);
    if (buf == NULL) return NULL; // 内存申请失败处理

    int len = 0; // 当前已存储的字符长度
    int c; // 存储getchar返回值,用int兼容EOF

    while ((c = getchar()) != '\n' && c != EOF) {
        // 剩余空间不足,需要扩容(预留1位存\0)
        if (len + 1 >= init_size) {
            init_size *= 2; // 2倍扩容,平衡性能和内存浪费
            char* new_buf = (char*)realloc(buf, init_size);
            if (new_buf == NULL) { // 扩容失败释放原有内存,避免泄漏
                free(buf);
                return NULL;
            }
            buf = new_buf;
        }
        buf[len++] = c;
    }

    // 缩容到刚好匹配输入长度的大小(len是字符数,+1存\0)
    char* result = (char*)realloc(buf, len + 1);
    if (result == NULL) {
        free(buf);
        return NULL;
    }
    result[len] = '\0'; // 补字符串终止符
    return result;
}

int main() {
    printf("请输入单词:");
    char* str = read_dynamic_string();
    if (str != NULL) {
        printf("输入内容为:%s\n",  str);
        printf("字符串占用内存大小(含\\0):%zu字节\n", sizeof(char) * (strlen(str) + 1));
        free(str); // 用完必须释放动态申请的内存
    }
    return 0;
}

效果验证

输入hello时,程序最终返回的字符串内存大小为6字节,刚好存储h e l l o \0共6个字符,和需求完全匹配。

注意:动态申请的内存使用完成后必须调用free()释放,否则会出现内存泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:27:05