C 中的标准输入,具有足够的内存

问题描述 投票:0回答:2

我正在开发一个程序,该程序从 STDIN 接收命令(指函数)及其各自的参数。例如:

add 2 3
。我想过以字符数组的形式输入
"add 2 3"
,但我想知道是否有办法为每个输入分配刚好足够的内存,以免浪费内存,或者内存不足。

c memory malloc
2个回答
3
投票

如果您使用 POSIX,则可以使用

getline
读取输入行并分配内存:

char *line = NULL;
size_t len = 0;
while (getline(&line, &len, stdin) > 0) {
    // read a line of input into line
    ... do something with it
}
free(line);
line = NULL;   // in case we want to use it again

这将根据需要分配内存来保存读取的行(为每个后续行重复使用相同的内存,因此如果您想保存一行,则需要复制它)。它可能会分配超过一行所需的数量,但您可以在

len

中看到实际分配的数量

0
投票

完成此操作的典型方法是使用不断增长的缓冲区,缓冲区满时会加倍。这样您最多将使用所需内存量的 2 倍。即使在 DOS 时代,我们也没有分配足够的资源。那将是灾难性的。

char *getline()
{
    static char *buf;
    static size_t bufsiz;
    if (!bufsiz) { buf = malloc(16); if (!buf) return buf; /* ERROR */ bufsiz = 16; }
    size_t n = 0;
    int c;
    while ((c = getc(stdin)) != EOF && c != '\n') {
        buf[n++] = c;
        if (n == bufsiz) {
            char *newbuf = realloc(buf, bufsiz << 1);
            if (!newbuf) return NULL;
            buf = nebuf;
            bufsiz <<= 1;
        }
    }
    buf[n] = 0;
    return buf;
}
© www.soinside.com 2019 - 2024. All rights reserved.