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

使用getopt()进行C编程:给出命令行标志标准,c,debugging,command-line-arguments,getopt,getopt-long,C,Debugging,Command Line Arguments,Getopt,Getopt Long,我开始自学C语言。我在这里和那里遇到了一些困难,但现在我被getOpt()难倒了。给我带来麻烦的主要事情是当我试图使某些标志依赖于其他标志时。例如,我希望这些能够起作用: ./myfile -a -b -c blue 但是,没有-a,其他任何一个选项都不起作用。因此,/myfile-b-c purple将无效。getopt是否可以处理这种“依赖于标志”的标准?我该怎么做呢?第二,让我们说,无论传递的是哪面旗帜,它都必须是一种颜色 因此,/myfile-a-b绿色和/myfile红色都是有效的。

我开始自学C语言。我在这里和那里遇到了一些困难,但现在我被
getOpt()
难倒了。给我带来麻烦的主要事情是当我试图使某些标志依赖于其他标志时。例如,我希望这些能够起作用:

./myfile -a -b -c blue
但是,没有-a,其他任何一个选项都不起作用。因此,
/myfile-b-c purple
将无效。getopt是否可以处理这种“依赖于标志”的标准?我该怎么做呢?第二,让我们说,无论传递的是哪面旗帜,它都必须是一种颜色

因此,
/myfile-a-b绿色
/myfile红色
都是有效的。我知道这一切都在getOpt()的options参数中(当前设置为类似于“abc”)但我如何在不执行“a:b:c:”的情况下为每个实例创建一个必需的参数,因为如果没有传递标志,这将不包括强制颜色

以下是
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);
}
第一次将aflag设置为0。最后,您将检查在未设置
aflag
的情况下传递其他选项的非法情况

总之,它看起来是这样的:

         case 'a':
                 aflag = 1;
                 break;
#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);
}
#包括
#包括
#包括
int
main(int argc,char*argv[])
{
int标志,opt;
国际nsecs,tfnd;
int aflag;
nsecs=0;
tfnd=0;
flags=0;
aflag=0;
而((opt=getopt(argc,argv,ant:)!=-1)
{
开关(opt)
{
案例“a”:
aflag=1;
打破
案例“n”:
旗帜=1;
打破
案例“t”:
nsecs=atoi(optarg);
tfnd=1;
打破
默认值:/*'?'*/
fprintf(标准格式,“用法:%s[-t nsecs][n]name\n”,argv[0]);
退出(退出失败);
}
}
printf(“标志=%d;tfnd=%d;optind=%d\n”,标志,tfnd,optind);
如果(optind>=argc)
{
fprintf(stderr,“选项后的预期参数\n”);
退出(退出失败);
}
如果(!aflag&&(flags | | tfnd))
{
fprintf(stderr,“必须指定使用n或t标志的标志”);
退出(退出失败);
}
printf(“名称参数=%s\n”,argv[optind]);
/*省略其他代码*/
退出(退出成功);
}

第一个问题(使-b仅与-a组合有效)在getopt中是不可能的-但是在迭代给定参数时,您可以很容易地自己检查这种情况。如何迭代参数?很抱歉,对C来说还是很陌生的。我如何迭代参数您在使用getopt时总是迭代参数。您只需多次调用
getopt
。(请注意,此函数在内部存储其状态,因此它总是知道下一步返回哪个参数)。abligh已经发布了一个例子。