【问题标题】:String array as long as input字符串数组只要输入
【发布时间】:2019-06-14 20:29:27
【问题描述】:

在 C 语言中,我想从用户那里获取输入,但我不知道它需要多长时间。我想我应该使用malloc()来设置文本数组的长度:

char *text = NULL;
text = malloc(sizeof(input))

但是,我如何在使用fgets() 将输入存储到数组的同时做到这一点?

fgets(text, sizeof text, stdin)

【问题讨论】:

  • 首先为字符串分配一个初始缓冲区,大小固定。然后调用fgets,将长度限制为缓冲区的大小。如果它读得少,那么你可以调用realloc 来减小大小,你就完成了。但如果可能还有更多,则调用realloc 将缓冲区大小加倍,继续读取,并根据需要重复。
  • 您还可以分配多个缓冲区并将它们链接在一起作为链表。
  • 如果我没听错,你应该尝试在这个链接中做这样的事情:How to read input of unknown length using fgets
  • 你几乎绝对不会使用char* text = malloc(sizeof(input))。也就是说,除非 input 恰好是一个静态分配的 char 数组(在这种情况下,由于您知道静态数组的大小,您很可能不需要动态分配另一个数组)。
  • sizeof text 是指针的大小 - 与读取用户输入无关。

标签: c arrays c-strings


【解决方案1】:

作为调用fgets 的结果存储的字符串将包含一个换行符,如果它可以放入缓冲区。如果读取的字符串以换行符结尾,您就知道您有一个完整的行。如果没有,你知道你需要阅读更多。

所以首先使用malloc 分配一个特定大小的缓冲区。然后使用fgets 填充缓冲区。如果缓冲区中没有换行符,请使用realloc 将其展开并再次使用fgets,从您离开的偏移量开始。

或者,如果您使用的是 Linux 等 POSIX 系统,则可以使用 getline,它会为您完成所有这些工作。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多