C语言 读取未知长度的输入字符串

C 语言中,读取未知长度的输入字符串是一项常见的挑战,因为标准输入函数(如 scanf、gets(已废弃))无法直接处理动态增长的字符串。C 代码需要跨平台兼容,建议使用 malloc() 和 realloc() 来处理未知长度的字符串输入。

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;
}
推荐阅读
cjavapy编程之路首页