【发布时间】:2014-06-24 06:18:56
【问题描述】:
我使用 getopt_long 读取命令行选项。代码:
#include <getopt.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
int ch;
struct option longopts[] = {
{"password", required_argument, NULL, 'p'},
{"viewonly", no_argument, NULL, 'v'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
while ((ch = getopt_long(argc, argv, "p:vh", longopts, NULL)) != -1) {
switch (ch) {
case 'p':
printf("optarg: %x %s\n", optarg, optarg);
break;
case 'v':
printf("viewonly is set\n");
break;
case 'h':
case '?':
default:
fprintf(stderr, "error\n");
exit(EXIT_FAILURE);
}
}
return 0;
}
我使用这个命令行选项:./a.out --password --viewonly,它应该打印错误消息--password 缺少参数,但getopt_long 从不返回'?',但将--viewonly 视为optarg --password。输出是:
optarg: 24992bc4 --viewonly
我觉得很奇怪,应该怎么做才能防止getopt_long把选项名当作参数呢?
【问题讨论】:
-
你不能。相反,您必须稍后在代码中检测问题,例如在检查密码时,然后告诉用户用户提供了错误的密码。
-
但它也隐藏了
viewonly选项,不被读取。可以手动正确吗? -
如果用户提供了错误的密码,你会在程序中使用
viewonly选项吗?用户传递了错误的密码(或者像您的情况一样“丢失”)这应该是一个非常致命的错误,这意味着用户将使用(希望是正确的)密码重新运行您的程序,问题是没有实际意义。您的问题只是此处提供的小测试程序中的问题。 -
如果您使用的是 C++,请尝试使用 Boost Program Options。
-
就在这里。但我认为还有一些其他条件需要考虑。为什么 getopt_long 没有检测到 optarg 是否以'-'或'--'开头并返回'? ?
标签: c++ c linux getopt getopt-long