解析命令行参数曾经是个麻烦的事,看完下面的示例就不会再感觉麻烦了
getopt可以会把输入排序成【选项 选项 选项 参数 参数】这种格式
其中选项(即以-开头的选项,包括参数)出现的顺序不变,参数出现顺序不变
即:只是把选项和参数分开,通过optarg解析选项,使用optind获取参数
详见使用示例:
- #include <stdio.h>
- #include <unistd.h>
- void usage(char *prg)
- {
- printf("Show how 'getopt' works/n");
- printf("usage: %s [-a 1] [-b 2] [-c 3] [-d] arg1 arg2/n/n", prg);
- printf("input whatever, eg: %s -a 1 arg2 -c 2 arg1 -b 3/n", prg);
- }
- int main(int argc, char **argv)
- {
- if(argc < 3)
- {
- usage(argv[0]);
- return -1;
- }
- int c;
- while ((c = getopt(argc, argv, ":a:b:c:d")) != -1)
- // 第一个: 表示隐藏错误信息,输入 -s -d,和去掉第一个:,比较下输出就知道了
- {
- switch (c)
- {
- case 'a':
- //a = atoi(optarg); //使用optarg获取选项的值
- break;
- case 'b':
- //b = optarg
- break;
- case 'c':
- //c = strlen(optarg);
- break;
- case 'd':
- //d = true;
- break;
- default:
- usage(argv[0]);
- //exit(0);
- return 0;
- }
- }
- // arg1 = argv[optind]; // 通过optind范围参数
- // arg2 = argv[optind+1];
- // getopt will reorder command line
- for(int i = 0; i < argc; i++)
- printf("%s ", argv[i])
- printf("/n");
- return 0;
- }
输入:
-a 1 arg2 -c 2 arg1 -b 3
getopt之后变成:
-a 1 -c 2 -b 3 arg2 arg1