getopt()函数解析命令行的可选参数
参考:http://www.cnblogs.com/qingergege/p/5914218.html
1. man 3 getopt可以查看详细信息及应用事例
int getopt(int argc,char * const argv[ ],const char * optstring);
argc, argv[ ]就是命令行的main的参数
optstring如下说明
2. 函数外围所用
小弟1、extern char* optarg; //选项的参数, 如-o myexe, 其中myexe就是optarg, -o为选项
小弟2、extern int optind; // 进行选项搜索时的索引,起始值为1, ./myexe -b 123 -c 456, 是以-b 开始,即1,0为可执行文件名称myexe;若多次执行getopt(),则为下一次保存的index
小弟3、extern int opterr; //是否将错误信息输出到stderr, 为0时表示不输出
小弟4、extern int optopt; //表示不在选项字符串optstring中的选项
3. 什么是选项
如:gcc helloworld.c -o helloworld.out; 这条指令中的-o就是命令行的选项,而后面的helloworld.out就是-o选项所携带的参数
有些选项是不用带参数的,而这样不带参数的选项可以写在一起,比如说有两个选项-r和-f,这两个选项都不带参数,那么他们是可以写在一起,写成-rf的, 如rm -rf test.txt
4. 选项字符串optstring
"a:b:cd:e", 这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数(没有带参数会报错哦),
但是这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a 123(中间有空格) 都表示123是-a的参数;
两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。
5. 示例代码
#include <unistd.h> #include <stdio.h>
int main(int argc, char * argv[]) {
int ch;
printf("\n\n");
printf("optind:%d,opterr:%d\n",optind,opterr);
printf("--------------------------\n");
while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)
{
printf("optind: %d\n", optind);
switch (ch)
{
case 'a':
printf("HAVE option: -a\n\n");
break;
case 'b':
printf("HAVE option: -b\n");
printf("The argument of -b is %s\n\n", optarg);
break;
case 'c':
printf("HAVE option: -c\n");
printf("The argument of -c is %s\n\n", optarg);
break;
case 'd':
printf("HAVE option: -d\n");
break;
case 'e':
printf("HAVE option: -e\n");
printf("The argument of -e is %s\n\n", optarg);
break;
case '?':
printf("Unknown option: %c\n",(char)optopt);
break;
}
}
}
./main -b "qing er"
输出结果为:
optind:1,opterr:1
--------------------------
optind: 3
HAVE option: -b
The argument of -b is qing er
optind和opterr的初始值都为1,前面提到过opterr非零表示产生的错误要输出到stderr上
执行后optind为什么是3,这是因为optind是下一次进行选项搜索的开始索引,也是说下一次getopt()函数要从argv[3]开始搜索。
当然,这个例子argv[3]已经没有了,此时getopt()函数就会返回-1
接下来我们看一个错误的命令行输入: ./main -z 123
optind:1,opterr:1
--------------------------
./main: invalid option -- 'z' optind: 2 Unknown option: z
其中./main: invalid option -- 'z'就是输出到stderr的错误输出。如果把opterr设置为0那么就不会有这条输出。
6. getopt()会改变argv[]中参数的顺序。经过多次getopt()后,argv[]中的选项和选项的参数会被放置在数组前面,而optind 会指向第一个非选项和参数的位置。
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int i;
for(i=0;i<argc;i++)
{
printf("%s\n",argv[i]);
}
...
getopt();
getopt();
...
for(i=0;i<argc;i++)
{
printf("%s\n",argv[i]);
}
}
./main zheng -b "qing er" han -c123 qing
输出为:
./main
zheng
-b
qing er
han
-c123
qing
./main
-b
qing er
han
-c123
qing
zheng
浙公网安备 33010602011771号