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

在C语言中如何获取用户输入的长度未知的字符串?

C语言读取命令行未知长度字符串的实现方案

方案1:使用POSIX标准getline()函数(推荐)

该方案是最简单的实现方式,POSIX.1-2008及后续标准已将getline()纳入标准库,它会自动根据输入内容的长度动态分配/扩容缓冲区,无需预先声明字符串长度。
示例代码:

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

int main() {
    char *buf = NULL;
    size_t buf_size = 0;
    ssize_t read_len;

    // 从标准输入(命令行交互输入)读取整行
    read_len = getline(&buf, &buf_size, stdin);
    if (read_len == -1) {
        perror("读取输入失败");
        free(buf);
        return 1;
    }

    printf("读取到的内容为:%s", buf);
    // 用完必须释放动态分配的缓冲区
    free(buf);
    return 0;
}

注意点:

  • getline()读取的内容默认会包含末尾的换行符,如有需要可以手动截断删除
  • 若buf初始为NULL、buf_size初始为0,函数会自动分配足够的内存存储输入内容

方案2:手动实现动态扩容逻辑(兼容全平台)

如果运行环境不支持getline()(比如部分老版本Windows C环境),可以自己实现逐字符读取+动态扩容的逻辑:
示例代码:

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

#define INIT_BUF_SIZE 32 // 初始缓冲区大小

int main() {
    char *buf = malloc(INIT_BUF_SIZE);
    if (!buf) {
        perror("内存分配失败");
        return 1;
    }

    size_t len = 0;
    size_t capacity = INIT_BUF_SIZE;
    int c;

    // 逐字符读取直到换行或EOF
    while ((c = getchar()) != EOF && c != '\n') {
        if (len + 1 >= capacity) {
            // 缓冲区不足时扩容为原来的2倍
            capacity *= 2;
            char *new_buf = realloc(buf, capacity);
            if (!new_buf) {
                perror("内存扩容失败");
                free(buf);
                return 1;
            }
            buf = new_buf;
        }
        buf[len++] = c;
    }
    buf[len] = '\0'; // 补字符串结束符

    printf("读取到的内容为:%s\n", buf);
    free(buf);
    return 0;
}

额外注意事项

  • 绝对不要使用已被C标准废弃的gets()函数,该函数无边界检查,存在严重的缓冲区溢出安全漏洞
  • 如果你需要读取的是程序启动时的命令行参数,直接使用main函数的argc和argv参数即可,操作系统已经帮你把所有参数处理为以\0结尾的字符串,无需手动处理长度分配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:45:04