1、使用 getline()(POSIX 标准,推荐)
getline()
是 POSIX 标准的一部分,在大多数 Unix/Linux 系统上可用。它能够自动调整缓冲区大小以适应输入。
#include <stdio.h> #include <stdlib.h> int main() { char *buffer = NULL; // 存储输入字符串的指针 size_t bufsize = 0; // 传递给 getline() 的缓冲区大小变量 ssize_t characters; // 读取的字符数 printf("Enter a string: "); characters = getline(&buffer, &bufsize, stdin); if (characters != -1) { printf("You entered: %s", buffer); } else { printf("Error reading input.\n"); } free(buffer); // 释放动态分配的内存 return 0; }
2、使用 malloc() 和 realloc() 动态分配内存
如果 getline()
不可用,可以手动管理缓冲区,通过 malloc()
和 realloc()
逐步扩展字符串存储空间。
#include <stdio.h> #include <stdlib.h> #define CHUNK_SIZE 10 // 每次扩展的字节数 int main() { char *buffer = NULL; int capacity = 0; int length = 0; int ch; printf("Enter a string: "); while ((ch = getchar()) != '\n' && ch != EOF) { if (length + 1 >= capacity) { capacity += CHUNK_SIZE; buffer = realloc(buffer, capacity); if (!buffer) { fprintf(stderr, "Memory allocation failed!\n"); return 1; } } buffer[length++] = ch; } if (buffer) { buffer[length] = '\0'; // 确保字符串以 null 终止 printf("You entered: %s\n", buffer); free(buffer); // 释放内存 } else { printf("No input received.\n"); } return 0; }
3、使用 scanf("%m[^\n]")
(GCC 扩展)
在 GNU C(GCC)编译器下,scanf
可以使用 %m
来动态分配内存。
#include <stdio.h> #include <stdlib.h> int main() { char *buffer = NULL; printf("Enter a string: "); scanf("%m[^\n]", &buffer); // 自动分配内存 if (buffer) { printf("You entered: %s\n", buffer); free(buffer); // 释放动态分配的内存 } return 0; }
4、使用 fgets()
(适用于固定缓冲区)
fgets()
可以安全读取字符串,并限制输入长度,但需要一个固定大小的缓冲区。
#include <stdio.h> int main() { char buffer[256]; // 设定固定大小 printf("Enter a string: "); if (fgets(buffer, sizeof(buffer), stdin)) { printf("You entered: %s", buffer); } return 0; }