Here有一个关于如何使用GNU getopt
的示例。我理解代码的大部分内容,但我有一些问题:
为什么包含ctype lib?
我的意思是unistd.h
需要getopt
,stdlib.h
需要abort
,而stdio.h
是io
的标准库。< / p>
在默认情况下,我们为什么要使用abort? '我们只是使用return 1;?
如果可能的话,我希望有人在optopt
,optind
和optarg
上分享包含更多详情的链接。
答案 0 :(得分:5)
ctype
需要isprint()
main
函数中执行此操作可能会稍微有用,但是打印错误然后调用exit(1)
可能会更好;我想这只是一个最小的例子,一行比两个短以下是您可能会发现有用的几个链接:
简而言之:
optopt
,optind
和optarg
是外部符号。它们是全局的,并在unistd.h
中声明。
optopt
(opt
= option
)。它应该与调用getopt
返回的值相同。
optarg
(arg
= argument
)很简单。这是一个旗帜的争论。例如如果-f
是需要文件名参数的选项(optstring
包含f:
),则可以执行类似
case 'f':
filename = optarg;
break;
optind
(ind
表示index
)告诉您while (flag = getopt...)
阻止结束后选项流程的完成位置。
e.g。在添加选项处理之前,您的脚本可能如下所示
// print command line arguments, start at 1 to skip the program name
for (int i = 1; i < argc; i++) {
printf("arg[%d]=%s\n", i, argv[i]);
}
添加getopt
块以处理选项后,您可以执行
// print command line arguments remaining after option processing
for (int i = optind; i < argc; i++) {
printf("arg[%d]=%s\n", i, argv[i]);
}
或
// skip command line options
argc -= optind; argv += optind;
// print command line arguments
for (int i = 0; i < argc; i++) {
printf("arg[%d]=%s\n", i, argv[i]);
}
如果您没有任何必需的命令行参数,那么您不必担心optind
。