函数原型:int getopt(int argc, char * const argv[], const char
*optstring);
extern char *optarg;
extern int optind, opterr, optopt;
getopt() 用来解析命令行参数。参数 argc 和 argv 是由 main() 传递的参数个数和内容。参数 optstring 为选项字符串, 告知 getopt() 可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量 optarg 指向此额外参数。getopt() 正常情况下返回相应的选项字符,当命令行所有参数全部解析完成后,返回 -1。如果在处理期间遇到了不符合 optstring 指定的其它选项 getopt() 将显示一个错误消息,并将全域变量 optarg 设为“?”字符,如果不希望 getopt() 印出错信息,则只要将全域变量 opterr 设为 0 即可。
getopt() 所涉及的全局变量包括:
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个已知选项。
optstring 中的指定的内容的意义(例如getopt(argc, argv, "ab:c:de::");
1.单个字符,表示选项,(如上例中的abcde各为一个选项)
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给 optarg。(如上例中的b:c:)
3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给 optarg。(如上例中的e::)
示例代码:
int main(int argc, char **argv)
{
int ret;
while((ret = getopt(argc, argv, "s:f:")) != -1)
{
switch(ret)
{
case 's': {
printf("Size = %s\n", optarg); break;
}
case 'f': {
printf("Font = %s\n", optarg); break;
}
default: {
printf("Usage: %s [-s Size] [-f font_file] \n", argv[0]);
return -1; break;
}
}
}
if (optind >= argc)
{
printf("Usage: %s [-s Size] [-f font_file] \n", argv[0]);
return -1;
}
return 0;
}
# ./getopt_test -s 16 -f sim.tff 1.txt
getopt_long() 的工作方式类似于getopt(),不过它还能接收长选项(--help)。在接收长选项之前,我们必须定义个一个结构体数组变量 longopts,指明我们希望获取的长选项。
函数原型:int getopt_long(int argc, char * const argv[], const char
*optstring, const struct option *longopts, int *longindex);
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
name:表示的是长参数名
has_arg:有3个值,no_argument(或者是0),表示该参数后面不跟参数值;required_argument(或者是1),表示该参数后面一定要跟一个参数值;optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值。
flag:指明长选项如何返回,如果 flag 为 NULL,则 getopt_long() 返回与该项 option 匹配的 val 值。否则 getopt_long() 返回 0。
val:和 flag 联合决定返回值。
option 数组的最后一个元素必须全部填充 0。
getopt_long() 的最后一个参数 longindex 在函数返回时指向被搜索到的选项在 longopts 数组中的下标。longindex 可以为 NULL,表明不需要返回这个值。
示例代码:
int main(int argc, char **argv)
{
struct option long_options[] =
{
{"h", no_argument, 0, 0},
{"help", no_argument, 0, 0},
{"input", required_argument, 0, 0},
{"output", required_argument, 0, 0},
{"v", no_argument, 0, 0},
{0, 0, 0, 0}
};
while(1)
{
int option_index = 0, c=0;
c = getopt_long (argc, argv, "xxx", long_options, &option_index);
/* no more options to parse */
if (c == -1) break;
/* unrecognized option */
if(c == '?') return -1;
switch(c) {
……
}
switch(option_index) {
……
}
}
}
getopt_long_only() 类似于 getopt_long(),但是它把 '-' 开头的选项当作长选项来处理。如果该选项与长选项不匹配,而与短选项匹配,则作为短选项解析。
函数原型:int getopt_long_only(int argc, char * const argv[], const char
*optstring, const struct option *longopts, int *longindex);
——忠于梦想 勇于实践 linux_xpj@opencores.org
阅读(985) | 评论(0) | 转发(0) |