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;
}