C - getopt_long()示例 - 在0

时间:2016-03-04 19:59:01

标签: c gnu getopt-long

我想正确使用getopt_long()并尝试理解为什么在example of getopt_long中做出了某些选择。 (我已经复制了下面的完整代码清单。)

我理解当结构的标志字段不为空(find getopt_long returns 0)时会发生情况0,但为什么示例显示重新测试 long_options[option_index].flag为null 如果是0 ?鉴于我们的情况是0,这还不能保证吗?

问另一种方式:我可以提供什么输入来使代码进入案例0但是却失败了第一个if语句? printf ("option %s", long_options[option_index].name);无法访问吗?

25.2.4使用getopt_long解析长选项的示例

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

/* Flag set by ‘--verbose’. */
static int verbose_flag;

int
main (int argc, char **argv)
{
  int c;

  while (1)
    {
      static struct option long_options[] =
      {
        /* These options set a flag. */
        {"verbose", no_argument,       &verbose_flag, 1},
        {"brief",   no_argument,       &verbose_flag, 0},
        /* These options don’t set a flag.
           We distinguish them by their indices. */
        {"add",     no_argument,       0, 'a'},
        {"append",  no_argument,       0, 'b'},
        {"delete",  required_argument, 0, 'd'},
        {"create",  required_argument, 0, 'c'},
        {"file",    required_argument, 0, 'f'},
        {0, 0, 0, 0}
      };
    /* getopt_long stores the option index here. */
    int option_index = 0;

    c = getopt_long (argc, argv, "abc:d:f:", long_options, &option_index);

    /* Detect the end of the options. */
    if (c == -1)
      break;

    switch (c)
      {
      case 0:
        /* If this option set a flag, do nothing else now. */
        if (long_options[option_index].flag != 0)
          break;
        printf ("option %s", long_options[option_index].name);
        if (optarg)
          printf (" with arg %s", optarg);
        printf ("\n");
        break;

      case 'a':
        puts ("option -a\n");
        break;

      case 'b':
        puts ("option -b\n");
        break;

      case 'c':
        printf ("option -c with value `%s'\n", optarg);
        break;

      case 'd':
        printf ("option -d with value `%s'\n", optarg);
        break;

      case 'f':
        printf ("option -f with value `%s'\n", optarg);
        break;

      case '?':
        /* getopt_long already printed an error message. */
        break;

      default:
        abort ();
      }
  }

/* Instead of reporting ‘--verbose’
   and ‘--brief’ as they are encountered,
   we report the final status resulting from them. */
if (verbose_flag)
  puts ("verbose flag is set");

/* Print any remaining command line arguments (not options). */
if (optind < argc)
  {
    printf ("non-option ARGV-elements: ");
    while (optind < argc)
      printf ("%s ", argv[optind++]);
    putchar ('\n');
  }

exit (0);

}

0 个答案:

没有答案