【问题标题】:How does getopt() know when to stop?getopt() 如何知道何时停止?
【发布时间】:2017-08-22 01:24:57
【问题描述】:

我有一些看起来像这样的东西:

while((ch = getopt(argc, argv, "d:t")) != EOF) { ... }

我可以这样调用函数:

./foo -d "my house" -t some more thoughts

getopt() 不知何故知道 -d 和 -t 是选项,但之后它知道 'some' 'more' 和 'thoughts' 供以后使用。 getopt() 寻找什么来知道它已完成处理 args?什么是 EOF?

【问题讨论】:

  • getopt 没有返回 EOF。一开始就用错了。
  • 大概它会寻找不以-开头的东西?
  • 它已经完成了 args 的处理,因为它查看了你告诉它的参数数量 (argc) 并取出了它关心的参数 (-d <value>-t)
  • 您告诉getopt "d:t" 的有效选项是什么。如果您的问题是关于如何编写解析器,那么这个问题就太宽泛了。 getopt 返回-1,而EOF 可以是任何负值(实现定义)。

标签: c command-line command-line-arguments getopt


【解决方案1】:

如 cmets 中所述,将 EOFgetopt() 一起使用是错误的(并且“碰巧”在将 -1 用于 EOF 的系统上工作)。使用-1

关于您的其他问题:

getopt() 查找什么来知道它已完成处理 args?

答案很简单。 getopt() 要求在调用您的程序时使用选项其他参数之前。所以它会在第一次找到时停止

  • NULL(表示argv[] 的结束)或到达argc 时(取决于实现)或
  • 一个不以- 开头的参数,并且没有被配置字符串中的: 使用。

【讨论】:

  • EOF 绝非巧合;它是 getopt 的原始记录返回值,例如 4.4BSD getopt.cman page source 但 POSIX 更改了它。
  • @WumpusQ.Wumbley:当getopt()<stdio.h>(sonme 系统声明它,因为使用它的人需要EOF)到<unistd.h>(这不会定义EOF)。请参阅getopt() 的 POSIX 规范的基本原理部分。
猜你喜欢
  • 1970-01-01
  • 2022-08-16
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多