我如何不断地获取用户输入(字符串),直到在 C 中按下输入,就像string
在 C++ 中的类一样?
我不知道输入大小,所以我不能声明一个固定大小的变量,甚至我不能使用malloc()
or动态分配内存calloc()
。
有没有办法将它作为一个单独的函数来实现?
正如 H2CO3 所说,您应该分配一个缓冲区malloc()
,然后realloc()
在它填满时调整它的大小。像这样:
size_t bufsize = 256;
size_t buf_used = 0;
int c;
char *buf = malloc(bufsize);
if (buf == NULL) { /* error handling here */ }
while ((c = fgetc(stdin)) != EOF) {
if (c == '\n') break;
if (buf_used == bufsize-1) {
bufsize *= 2;
buf = realloc(buf, bufsize);
if (buf == NULL) { /* error handling here */ }
}
buf[buf_used++] = c;
}
buf[buf_used] = '\0';
使用指数存储扩展:
char *read_a_line(void)
{
size_t alloc_size = LINE_MAX;
size_t len = 0;
char *buf = malloc(LINE_MAX); // should be good for most, euh, *lines*...
if (!buf)
abort();
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF) {
if (len >= alloc_size) {
alloc_size <<= 1;
char *tmp = realloc(buf, alloc_size);
if (!tmp)
abort(); // or whatever
buf = tmp;
}
buf[len++] = c;
}
if (len >= alloc_size) {
alloc_size++;
char *tmp = realloc(buf, alloc_size);
if (!tmp)
abort(); // or whatever
buf = tmp;
}
buf[len] = 0;
return buf;
}
在 C 语言中,您别无选择:如果要输入无限长度的字符串,则必须在循环中使用分配。无论您使用realloc()
缓冲区还是链接列表,它都归结为读取(通常通过fgets()
),读取更多内容,等等,直到您刚刚读取的缓冲区包含一个\n
.
然后,根据方法,您要么已经有一个连续的缓冲区(realloc
方法),要么只需将它们全部连接起来(链表方法)。然后就可以返回了。
如果幸运的话,您的平台附带了getline()
为您执行 realloc 方法的扩展功能。如果没有,你将不得不自己写。