在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
相关产品推荐
相关产品推荐

