getopt()
表现不像我期望的短期选择。
例如:使用缺少的参数调用以下程序:
有效案例:testopt -d dir -a action -b build
错误案例:testopt -d -a action -b build
这没有抛出任何错误,因为我期待-d
我的代码:
#include <unistd.h>
/* testopt.c */
/* Test program for testing getopt */
int main(int argc, char **argv)
{
int chr;
while ( ( chr = getopt(argc, argv, ":d:a:b:") ) != -1 )
{
switch(chr)
{
case 'a':
printf("Got a...\n");
break;
case 'b':
printf("Got b...\n");
break;
case 'd':
printf("Got d...\n");
break;
case ':':
printf("Missing operand for %c\n", optopt);
break;
case '?':
printf("Unknown option %c\n", optopt);
break;
}
}
printf("execution over\n");
return 0;
}
答案 0 :(得分:4)
getopt()
认为-a
是-d
的参数,而非选项。
尝试testopt -a action -b build -d
- 它应该抱怨缺少参数。
您需要检查-d
具有有效值的optarg
选项(和所有其他选项) - 开头没有短划线的选项。
答案 1 :(得分:0)
根据the manual page,你应该用冒号开始你的选项字符串,以使getopt()
返回':'
来表示缺少参数。默认似乎是返回'?'
。
答案 2 :(得分:0)
上面的代码对我来说很好,在Red Hat上使用gcc 3.4.5:
$ ./a.out -d test
Got d...
execution over
$ ./a.out -d
Missing operand for d
execution over
你的环境是什么?
更新:好的,qrdl正好点亮。为什么getopt()会这样工作?