【问题标题】:Reading from Command Line in C从 C 中的命令行读取
【发布时间】:2012-02-19 22:39:37
【问题描述】:

我有一个在命令行中运行的程序(C 语言),我希望它接受来自用户的任意长度的字符串。如果我使用 C++ 编程,我可能会使用字符串库中的 getline() 函数,但我似乎找不到 C 等价物。我是否只需要读取 X 长度块中的字符,如果字符串超过 X 长度,则创建一个新的更大的块并将数据复制到新块?

【问题讨论】:

  • 有一个非标准的getline 可用于 POSIX 系统。除此之外,您可以使用getcrealloc 自行滚动。
  • 不熟悉getline(),但不是将字符串复制到越来越大的内存块中,理想情况下您只需根据需要分配 X 长度的块,同时跟踪每个分配的块。这个 1 个或多个块的集合将代表输入字符串。

标签: c string command-line getline


【解决方案1】:

您可以将fgetssscanf 一起使用。

请注意,getline 现在出现在当前的 POSIX:2008 标准中。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html

【讨论】:

  • fgets 需要一个最大长度,为什么不首先使用scanf
  • @minitech fgets + sscanf 通常比scanf 更受欢迎,请参阅c-faq.com/stdio/scanfprobs.html 了解更多信息
  • 好的,但这并不能回答问题。编辑:没关系,看到编辑。
  • 那么如果我想从命令行读取而不是从文件中读取,我应该将什么传递给get line()的文件参数?
  • @mrswmmr 你传递了stdin 这是在stdio.h 中定义的宏
【解决方案2】:

使用 readline 库 http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html(如果您不喜欢该许可证,还有一个等效的 BSD)。

从那里,您可以使用函数readline(),它将返回给您用户键入的行的char *(请确保在完成后调用free(),否则您将获得内存泄漏)。您甚至可以设置一些选项,以便您的用户可以按向上箭头来获取他们的上一行(就像在几乎所有其他终端中一样)。

【讨论】:

    【解决方案3】:

    您可以使用realloc() 来增加您的输入缓冲区。无需复制数据;它为你做到了。一个常见的模式是:

    if (n_read >= buf_size) {
      buf_size *= 2;
      *buf = realloc(sizeof(char) * buf_size);
    }
    

    【讨论】:

      最近更新 更多