在getopt中发出选项顺序问题

时间:2015-02-05 22:11:19

标签: c getopt

我遇到getopt时遇到问题。在我的程序中,我希望使用以下选项运行该程序:-l -w -n -bnb是可选的,但该计划必须包含lw,而不是两者。此外,如果调用w,则必须后跟参数。此外,订单首先应为lw,然后是nb,其顺序无关紧要。

以下是有效参数的示例:

./prog -l -n -b
./prog -w argument -b -n
./prog -l -n
./prog -l -b

这些示例无效:

./prog -l -w argument
./prog -n -l
./prog -b -l

根据这些要求,我在使用getopt时遇到了麻烦。当然,我可以使用无数的if else语句,但这会很难看并且不必要地复杂化。

具体来说,我在查询顺序方面遇到问题,并使-l-w选项成为一种或两种关系。

到目前为止,这是我所拥有的,尽管由于这些不确定因素并不多。

while ((option = getopt(argc, argv,"lw:nb:")) != -1) {
  switch(option) {
  case'l': ...  // I haven't wrote anything here yet
  case'w': ...
  case'n': ...
  case'b': ...
  case '?': ...
  default: ...
  }
}

1 个答案:

答案 0 :(得分:2)

首先,getopt确保w有一个参数。这就是重点 你的getopt字符串中的:。如果-b不需要参数,那么您应该删除它之后的:

其次,我认为验证论证条件并不像你想的那么糟糕 这将是。你应该已经有变量来跟踪你的 选项,像这样:

int opt_l = 0;
int opt_w = 0;
char *arg_w = 0;
int opt_n = 0;
int opt_b = 0;

您还应该有一个打印出用法和有用错误的函数 消息给用户,如下:

int exit_usage(const char *err)
{
    if( err ) { printf("Bad arguments: %s\n", err); }
    printf("Usage: ...\n");
    exit(1);
}

然后,这是一个简单的单行检查来验证您的前提条件。如果一个 前提条件失败,然后打印错误并向用户显示使用信息。 您不必将前置条件检查塞入一行,但它往往会 当它们都是一行时,更容易阅读一系列先决条件。 像这样:

while ((option = getopt(argc, argv, "lw:nb")) != -1)
{
    switch(option)
    {
    case 'l':
        if( opt_w != 0 ) { exit_usage("Cannot combine -l with -w"); }
        ++opt_l;
        break;
    case 'w':
        if( opt_l != 0 ) { exit_usage("Cannot combine -l with -w"); }
        arg_w = optarg;
        ++opt_w;
        break;
    case 'n':
        if( opt_l == 0 && opt_w == 0 ) { exit_usage("-n requires -l or -w first"); }
        ++opt_n;
        break;
    case 'b':
        if( opt_l == 0 && opt_w == 0 ) { exit_usage("-n requires -l or -w first"); }
        ++opt_b;
        break;
    case '?':
        exit_usage(NULL);
        break;
    default:
        break;
    }
}