2

我如何不断地获取用户输入(字符串),直到在 C 中按下输入,就像string在 C++ 中的类一样?

我不知道输入大小,所以我不能声明一个固定大小的变量,甚至我不能使用malloc()or动态分配内存calloc()

有没有办法将它作为一个单独的函数来实现?

4

3 回答 3

7

正如 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';
于 2013-08-20T13:34:42.317 回答
3

使用指数存储扩展:

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;
}
于 2013-08-20T13:35:48.213 回答
2

在 C 语言中,您别无选择:如果要输入无限长度的字符串,则必须在循环中使用分配。无论您使用realloc()缓冲区还是链接列表,它都归结为读取(通常通过fgets()),读取更多内容,等等,直到您刚刚读取的缓冲区包含一个\n.

然后,根据方法,您要么已经有一个连续的缓冲区(realloc方法),要么只需将它们全部连接起来(链表方法)。然后就可以返回了。

如果幸运的话,您的平台附带了getline()为您执行 realloc 方法的扩展功能。如果没有,你将不得不自己写。

于 2013-08-20T13:32:55.843 回答