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

时间:2015-01-25 18:09:10

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

我开始自学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:”的情况下为每个实例创建一个参数: “因为如果没有传递标志,这将不包括强制性颜色。

1 个答案:

答案 0 :(得分: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);
}