在C中读取没有maxsize的用户输入

时间:2013-02-03 12:26:10

标签: c input stdin

在C中我可以使用char *fgets(char *s, int size, FILE *stream)函数从stdin读取用户输入。但是用户输入的大小限制为size。 如何读取可变大小的用户输入?

2 个答案:

答案 0 :(得分:1)

此函数从标准输入读取,直到遇到文件结尾,并返回读取的字符数。将它修改为只读一行或类似,应该相当容易。

ssize_t read_from_stdin(char **s)
{
    char buf[1024];
    char *p;
    char *tmp;

    ssize_t total;
    size_t len;
    size_t allocsize;

    if (s == NULL) {
        return -1;
    }

    total = 0;

    allocsize = 1024;
    p = malloc(allocsize);
    if (p == NULL) {
        *s = NULL;
        return -1;
    }

    while(fgets(buf, sizeof(buf), stdin) != NULL) {
        len = strlen(buf);

        if (total + len >= allocsize) {
            allocsize <<= 1;
            tmp = realloc(p, allocsize);
            if (tmp == NULL) {
                free(p);
                *s = NULL;
                return -1;
            }

            p = tmp;
        }

        memcpy(p + total, buf, len);
        total += len;
    }       

    p[total] = 0;
    *s = p;

    return total;
}

答案 1 :(得分:1)

在C中,您负责缓冲,并负责其大小。所以你不能为你准备好一些动态缓冲区。 因此,唯一的解决方案是使用循环(fgets或fgetc中的任何一个 - 取决于您的处理和停止条件)

如果你超越C到C ++,你会发现你可以接受可变大小的std :: string对象(你需要处理单词和/或行终止 - 然后再循环)