我正在开发一个程序,它从STDIN接收命令(指函数)及其相应的参数。举例来说:add 2 3。我想输入"add 2 3"作为字符数组,但我想知道是否有任何方法可以为每个输入分配足够的内存,以免浪费内存,或者内存不足。
add 2 3
"add 2 3"
q5iwbnjs1#
如果你使用的是POSIX,你可以使用getline来读取输入行并分配内存:
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中看到它实际分配了多少
len
whitzsjs2#
典型的方法是使用一个不断增长的缓冲区,当满的时候它会加倍。这样,您将使用最多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; }
字符串
2条答案
按热度按时间q5iwbnjs1#
如果你使用的是POSIX,你可以使用
getline
来读取输入行并分配内存:字符串
这将根据需要分配内存来保存读取的行(为每个后续行重用相同的内存,因此如果您想要保存一行,则需要复制它)。它分配的可能比一行所需的多,但是您可以在
len
中看到它实际分配了多少whitzsjs2#
典型的方法是使用一个不断增长的缓冲区,当满的时候它会加倍。这样,您将使用最多2倍的内存量,你需要的。即使在DOS的日子里,我们也没有分配足够的资金。那将是灾难性的。
字符串