【问题标题】:Optional getopt function可选的 getopt 函数
【发布时间】:2016-09-23 07:37:02
【问题描述】:

我很难将 getopt 操作设为可选。这是我的代码的一部分。它接受一个参数文件,如果存在,它会计算字符数。如果不是,它会计算 stdinput 字符。

我的问题是 optarg 在未声明后设置为什么?以及如何使我的选项 -c 可选并使其工作。

目前它总是从标准输入读取。

while( (option = getopt(argc, argv, "c::") ) != -1 ) {
  switch(option) {
  case 'c':
    if (optarg == NULL) {
        file = stdin;
      }
    else {
      file = fopen(optarg, "r");
    }
    while( (ch = fgetc(file)) != EOF ) {
      count++;
    }
    printf("%d %s\n", count, optarg);
    fclose(file);
    break;

【问题讨论】:

  • "optarg 未声明后将设置为什么"???你再清楚不过了。
  • 为什么是::,而不是:
  • "两个冒号表示一个选项需要一个可选参数" - linuxmanual
  • 对不起,如果我不清楚。 I am clarifying whether optarg get set to NULL when the option -c becomes optional.我认为这可能是为什么这是错误的,因为当我打印 optarg 时,它会给出 Seg Fault
  • 我不知道这个 GNU 扩展。请查看我的更新答案。

标签: c getopt


【解决方案1】:

“标准”(POSIX)getopt() 不支持选项的可选参数。使用双冒号"::"GNU getopt() 扩展。

要让getopt()optarg 设置为选项的“可选”参数,请在调用程序时使用该选项,如下所示:

program -coptional_argument_to_option_c

但是,您也可以选择以下方法之一:

  • 定义-c filenamefilename 是强制性的。如果-c filename 未命中,只需计算从stdin 读取的内容。

  • 或者定义-c,不带参数告诉你的程序做什么(在这里算),另外定义一个选项告诉你的程序从哪里读取 喜欢-f filename。如果后者未命中,则从stdin 读取。

【讨论】:

  • 当文件名参数是强制性的 (c:) 时,getopt() 会自动指示该选项需要一个参数。那么我在哪里放置条件语句呢?
  • @Sarc:哪个“条件语句”?
  • 谢谢,我通过第一个替代方案解决了
【解决方案2】:

我在 getopt 手册页中找到了这个:

两个冒号表示一个选项带有一个可选参数;如果当前 argv 元素中有文本(即与选项名称本身在同一个词中,例如“-oarg”),则在 optarg 中返回,否则将 optarg 设置为零。

http://linux.die.net/man/3/getopt_long

这个页面解释得更好一点:

http://www.informit.com/articles/article.aspx?p=175771&seqNum=3

最后,如果 optstring 中的选项字母后跟两个冒号字符,则该选项允许有一个可选的选项参数。 (说快三倍!)如果这样的参数与选项在同一个 argv 元素中,则认为它存在,否则不存在。在它不存在的情况下,GNU getopt() 返回选项字母并将 optarg 设置为 NULL。例如,给定——

while ((c = getopt(argc, argv, "ab::")) != 1) ...

——对于 -bYANKEES,返回值为 'b',optarg 指向“YANKEES”,而对于 -b 或 '-b YANKEES',返回值仍然是 'b',但 optarg 设置为 NULL。在后一种情况下,“YANKEES”是一个单独的命令行参数。

检查这是否也适合您。

【讨论】:

  • 谢谢,这个简短的选项语法相当神秘。
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2010-11-06
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多