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

is there a way to use fgets size dynamically

所以我正在学习指针和动态内存以及如何试验 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);但是还是不行?

这是行不通的,因为 sizeof(ptr) 其中 ptr 是一个指向 char 数组的动态指针,它将始终是指针的大小(64 位机器为 8),而不是数组的大小。你必须:

  • 或者将 200 存储在某种变量中;或者
  • 为文本静态分配内存,如char text[200];

一种常见的方法是分配一些上限大小的缓冲区,然后 right-size 它。

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_size 超出 int 范围的代码。