linux 中getopt和getopt_long 用法解析

linux 英文手册:
http://man7.org/linux/man-pages/man3/getopt.3.html
参考博客:
http://blog.csdn.net/lyh66/article/details/50098739

getopt解析参数

运行main(argc,argv),使用getopt(argc,argv,optstring)解析参数
参数optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数。
如getopt(argc, argv, “ls:fc:h::d:”)中,l和f 选项不需要参数,s,c,d需要参数,h可以有参数也可以没有参数。
如在命令行:gcc -o main main.c
main -l -s aa -f -c kk

1.单个字符,表示选项,l,s,f,c,h,d均为选项
2.单个字符后接一个冒号:表示该选项后必须跟一个参数,参数紧跟在选项 后或者以空格隔开,该参数的指针赋给optarg
3.单 个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开,如果没有跟参数,则 optarg=NULL。

返回值

getopt()每次调用会逐次返回命令行传入的参数,当没有参数的最后的一次调用时,getopt()将返回-1
当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回’?’
其 它情况可以看上边链接,例子也可以看上边链接

getopt_long解析参数

int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

getopt_long除了可以支持-开始的单字符开始选项,还支持–开始选项。如果只支持–开始选项,将optstring设置为”“。

struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};

结构体option各个字段的意思如下:
name 长选项的名字
has_arg
no_argument(或0):选项不携带参数;required_argument(或1):选项需要参数;optional_argument(或2):选项携带参数可选
flag
指定该长选项的返回值。如果flag是NULL,getopt_long会返回val。(比如,调用者可以设置val为短选项字符)否则,getopt_long会返回0,且flag指向的值设置为val的值,前提是该选项成功找到了。
val
当做返回值,或把值加载进flag所指的内存中。

longopts指向的数组的最后一个元素值都设置为0。

如果longindex不是NULL,则它指向getopt_long()获得的长选项longopts的下标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`getopt_long` 是一个 C 语言的函数,用于解析命令行参数。与传统的 `getopt` 函数不同,`getopt_long` 支持长选项(如 --help)和短选项(如 -h)。 下面是 `getopt_long` 的基本用法: ```c #include <stdio.h> #include <stdlib.h> #include <getopt.h> int main(int argc, char *argv[]) { int c; int digit_optind = 0; while (1) { int option_index = 0; static struct option long_options[] = { {"add", required_argument, 0, 0 }, {"append", no_argument, 0, 0 }, {"delete", required_argument, 0, 0 }, {"verbose", no_argument, 0, 0 }, {"create", required_argument, 0, 'c'}, {"file", required_argument, 0, 0 }, {0, 0, 0, 0 } }; c = getopt_long(argc, argv, "abc:d:012", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf("option %s", long_options[option_index].name); if (optarg) printf(" with arg %s", optarg); printf("\n"); break; case '0': case '1': case '2': if (digit_optind != 0 && digit_optind != optind) printf("digits occur in two different argv-elements.\n"); digit_optind = optind; printf("option %c\n", c); break; case 'a': printf("option a\n"); break; case 'b': printf("option b\n"); break; case 'c': printf("option c with value '%s'\n", optarg); break; case 'd': printf("option d with value '%s'\n", optarg); break; case '?': break; default: printf("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf("non-option ARGV-elements: "); while (optind < argc) printf("%s ", argv[optind++]); printf("\n"); } exit(EXIT_SUCCESS); } ``` 上面的代码演示了 `getopt_long` 的基本用法。其 `long_options` 数组定义了长选项的名称、参数类型以及对应的短选项(如果有的话)。在调用 `getopt_long` 函数时,第三个参数为短选项字符串,其冒号表示该选项需要参数。 函数返回值为下一个选项的字符编码,或者 -1 表示已经解析完所有选项。如果选项需要参数,则该参数存储在全局变量 `optarg` 。 更多关于 `getopt_long` 的用法,可以参考其官方文档:http://man7.org/linux/man-pages/man3/getopt_long.3.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值