说,我有代码:
while ((c = getopt(argc, argv, ":n:p")) != -1) {
switch (c) {
case 'n':
syslog(LOG_NOTICE, "n: %s", optarg);
break;
case 'p':
/* ... some code ... */
break;
case ':':
/* handle missing arguments to options requiring arguments */
break;
/* some cases like '?', ... */
default:
abort();
}
}
当我将我的程序称为
时./main -n -p
打印:
n: -p
为什么不返回getopt:表示缺少-n的参数但是使用-p作为参数参数?
答案 0 :(得分:2)
完全可以使用以破折号开头的选项参数,并且通常类似于另一个选项。 getopt没有理由报告错误。
如果程序不想接受这样的选项参数,它应该专门检查它们,例如
if (optarg[0] == '-') {
// oops, looks like user forgot an argument
err("Option requires an argument");
}
答案 1 :(得分:1)
我有类似的问题,我让它落到了默认情况。不确定是否操纵optopt变量是一个问题,但似乎有效:
while ((c = getopt(argc, argv, "a:d:x")) != -1)
{
switch (c)
{
case 'a':
if (optarg[0] == '-' && err == 0)
{
err = 1;
optopt = 'a';
}
else if (err == 0)
{
aflag = 1;
aArg = optarg;
break;
}
case 'd':
if (optarg[0] == '-' && err == 0)
{
err = 1;
optopt = 'd';
}
else if (err == 0)
{
dflag = 1;
dArg = optarg;
break;
}
case 'x':
if (err == 0)
{
xflag = 1;
break;
}
default:
if (optopt == 'a' || optopt == 'd')
{
fprintf(stderr, "Option -%c requires an argument.\n", optopt);
return 1;
}
else
{
fprintf(stderr, "Unknown option '-%c'\n", optopt);
return 2;
}
}//end of switch
}//end of while