我遇到getopt
时遇到问题。在我的程序中,我希望使用以下选项运行该程序:-l -w -n -b
。 n
和b
是可选的,但该计划必须包含l
或w
,而不是两者。此外,如果调用w
,则必须后跟参数。此外,订单首先应为l
或w
,然后是n
或b
,其顺序无关紧要。
以下是有效参数的示例:
./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: ...
}
}
答案 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;
}
}