有没有办法动态使用 FGETS 大小

is there a way to use fgets size dynamically

提问人:Oh Oh 提问时间:5/13/2022 最后编辑:Oh Oh 更新时间:5/14/2022 访问量:270

问:

所以我正在学习指针和动态内存,以及我如何尝试 fgets。

所以我想使用 fgets 将字符串输入到指针中,但我希望 fgets 大小使用我用于指针的 malloc 函数动态更改,有没有办法做到这一点? 例如

int main(){
    char *text;
    text =(char *)malloc(200 * sizeof(char));
    fgets(text, n, stdin);
    return 0;
}

解释

  1. 我创建了一个名为“text”的字符指针来最终存储字符串。
  2. 然后,我使用 malloc 计划来存储 200 个字符
  3. 接下来,我想使用 fgets 来接收用户输入的字符串,其中“n”是 malloc 为指针分配的文本大小?

我试过了,但它不起作用?fgets(text, sizeof(text), stdin);

c malloc fgets 大小

评论

1赞 Jabberwocky 5/13/2022
fgets(text, n, stdin);:什么?n
1赞 Gerhardh 5/13/2022
一个直接的解决方案是将大小存储在 中,然后使用 for 和 for 。你特别不喜欢什么?nnmallocfgets
1赞 Lundin 5/13/2022
一个常见的初学者错误是过分关注这里和那里的几个 100 字节。当您仍在学习基础知识时,不要担心优化内存使用或速度之类的事情。
0赞 Jabberwocky 5/13/2022
或者您是否希望能够读取任何大小的行,并根据读取的行的大小动态分配缓冲区?fgets

答:

1赞 Jakub Bednarski 5/13/2022 #1

这是行不通的,因为 ptr 是指向 char 数组的动态指针,将始终是指针的大小(对于 64 位计算机为 8),而不是数组的大小。您必须:sizeof(ptr)

  • 要么将 200 存储在某种变量中;或
  • 静态地为文本分配内存,例如char text[200];
0赞 chux - Reinstate Monica 5/14/2022 #2

一种常见的方法是分配一些上限大小缓冲区,然后调整其大小。

char *fgets_alloc(FILE *f, size_t max_size) {
  char *buf = malloc(max_size);
  if (buf) {
    if (fgets(buf, max_size, f)) {
      size_t sz = strlen(buf) + 1;
      void *ptr = realloc(buf, sz);  // Reduce allocation
      if (ptr) {
        buf = ptr;
      }
      return buf;
    }
    free(buf);
  }
  return NULL;
}   
  

待办事项:处理过长行和超出范围的代码。max_sizeint