我正在开发一个程序,该程序从 STDIN 接收命令(指函数)及其各自的参数。例如:
add 2 3
。我想过以字符数组的形式输入"add 2 3"
,但我想知道是否有办法为每个输入分配刚好足够的内存,以免浪费内存,或者内存不足。
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
中看到实际分配的数量
完成此操作的典型方法是使用不断增长的缓冲区,缓冲区满时会加倍。这样您最多将使用所需内存量的 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;
}