使用 getopt() 进行 C 编程:给出命令行标志标准

Posted

技术标签:

【中文标题】使用 getopt() 进行 C 编程:给出命令行标志标准【英文标题】:C programming with getopt(): giving command line flags criteria 【发布时间】:2015-03-24 06:01:23 【问题描述】:

我开始自学 C。我在这里和那里遇到了一些障碍,但现在我被 getOpt() 难住了。给我带来麻烦的主要事情是当我尝试使某些标志依赖于其他标志时。例如,我希望这些工作:

./myfile -a -b -c blue

但是如果没有 -a,其他选项都无法工作。因此./myfile -b -c purple 将无效。 getopt 是否可以处理这种“标志依赖”标准?我该怎么做呢?其次,让我们说无论传递哪些标志,它都必须是一种颜色。

所以./myfile -a -b green./myfile red 都是有效的。我知道这一切都在 getOpt() 的 options 参数中(当前设置为类似于“abc”),但是如何在不执行“a:b:c:”的情况下为每个实例设置一个参数: " 因为如果没有通过标志,这将不包括强制颜色。

【问题讨论】:

第一个问题(使 -b 仅与 -a 组合有效)无法使用 getopt - 但是在迭代给定参数时很容易自行检查这种情况。 如何迭代参数?对不起,对 C 来说还是很陌生。我如何迭代参数 在使用 getopt 时,您总是会遍历参数。您只是多次调用getopt。 (请注意,这个函数在内部存储它的状态,所以它总是知道接下来要返回哪个参数)。 abligh 已经发布了一个示例。 【参考方案1】:

这是getopt 的示例(来自手册页):

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

int
main (int argc, char *argv[])

  int flags, opt;
  int nsecs, tfnd;

  nsecs = 0;
  tfnd = 0;
  flags = 0;
  while ((opt = getopt (argc, argv, "nt:")) != -1)
    
      switch (opt)
        
        case 'n':
          flags = 1;
          break;
        case 't':
          nsecs = atoi (optarg);
          tfnd = 1;
          break;
        default:               /* '?' */
          fprintf (stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]);
          exit (EXIT_FAILURE);
        
    

  printf ("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);

  if (optind >= argc)
    
      fprintf (stderr, "Expected argument after options\n");
      exit (EXIT_FAILURE);
    

  printf ("name argument = %s\n", argv[optind]);

  /* Other code omitted */

  exit (EXIT_SUCCESS);

请注意,您需要添加一些声明和 main() 函数才能使其正常工作。

您可以看到上面的示例 n 是一个标志,其工作方式类似于您的 b 选项。上面的t 选项带有一个参数,其工作方式与您的c 选项类似。如果你想有一个a 选项也是一个标志,你可以让getopt 参数"abf:" (即在不带冒号的情况下添加a),并像这样在switch 中添加一个节:

         case 'a':
                 aflag = 1;
                 break;

首先将 aflag 设置为 0。最后,您将检查在未设置 aflag 的情况下传递了其他选项的非法条件。

总而言之,它看起来像这样:

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

int
main (int argc, char *argv[])

  int flags, opt;
  int nsecs, tfnd;
  int aflag;

  nsecs = 0;
  tfnd = 0;
  flags = 0;
  aflag = 0;
  while ((opt = getopt (argc, argv, "ant:")) != -1)
    
      switch (opt)
        
        case 'a':
          aflag = 1;
          break;
        case 'n':
          flags = 1;
          break;
        case 't':
          nsecs = atoi (optarg);
          tfnd = 1;
          break;
        default:               /* '?' */
          fprintf (stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]);
          exit (EXIT_FAILURE);
        
    

  printf ("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);

  if (optind >= argc)
    
      fprintf (stderr, "Expected argument after options\n");
      exit (EXIT_FAILURE);
    

  if (!aflag && (flags || tfnd))
    
      fprintf (stderr, "Must specify a flag to use n or t flag\n");
      exit (EXIT_FAILURE);
    

  printf ("name argument = %s\n", argv[optind]);

  /* Other code omitted */

  exit (EXIT_SUCCESS);

【讨论】:

以上是关于使用 getopt() 进行 C 编程:给出命令行标志标准的主要内容,如果未能解决你的问题,请参考以下文章

Python使用getopt处理命令行操作

Python使用getopt处理命令行操作

在Perl中使用Getopt::Long进行命令行解析

Python3+getopt解析命令行参数

命令行参数解析函数getopt和getopt_long函数

C命令行参数解析——getoptgetopt_long及getopt_long_only