我在GNU/Linux机器上使用getopt_long
。初始化选项列表为:
static struct option long_options[] = {
{"mode", required_argument, 0, 9},
{0, 0, 0, 0}
};
有以下代码行
c = getopt_long(argc, argv, "", long_options, index_ptr);
当我用命令
运行程序时:prog --mode
上面显示的代码行返回'?'在c中,但不是':',根据getopt(3)
手册页:"错误和-1返回与getopt()相同"
是的,当使用/解析短选项时,可以在选项列表中写入类似":m:"的东西,这样变量c的缺失参数将包含':',而不是'?',但是当解析只有长选项时,应该如何区分两种情况(缺少参数,无效选项)?
如何区分无效选项和缺少必要参数的选项?
要实现区分无效选项和缺少参数的有效选项的目标,我可以看到的唯一方法是将选项结构体的has_arg
字段设置为optional_argument
,然后手动测试参数。那么getopt_long()
只会返回一个值'?'当有一个无效的选项时,你可以检查一个指定的选项是否有一个参数通过查看optarg
。下面是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
int main(int argc, char *argv[])
{
int i, opt;
int index = -1;
static struct option long_options[] = {
{"mode", optional_argument, NULL, 'm'},
{0, 0, 0, 0}
};
/* suppress error messages */
//opterr = 0;
while ((opt = getopt_long(argc, argv, "", long_options, &index)) != -1) {
if (opt == '?') {
/* do something, perhaps: */
//printf("Invalid option n");
// exit(EXIT_FAILURE);
}
if (opt == 'm' && optarg == NULL) {
printf("Missing argument in '--mode' optionn");
exit(EXIT_FAILURE);
}
}
return 0;
}