相关函数表头文件:
#include<unistd.h>
定义函数:
int getopt(int argc,char* const argv[],const char* optstring);
extern char *optarg;
extern int optind,opterr,optopt;
几个全局变量的含义:
1、变量optind是getopt要处理的argv中的下一个字符串参数的索引。optind被系统初始化为1,我们可以将它重新赋值为1,从而可以重新开始扫描指针数组argv。默认值为1。
2、opterr控制getopt函数是否打印出错信息(当命令行选项不包括在optstring中或者缺少必要的参数时,会向stderr打印错误信息)。如果不希望打印出错信息,则只要将全局变量opterr设为0即可,反之设为1。默认值为1。
3、optarg:选项的参数指针,在检索到合法的选项字符之后,指向该字符后面的参数。
4、optopt:当命令行选项字符不包括在optstring中或者命令行选项字符包括在optstring中但是缺少必要的参数时,该选项存储在optopt中,getopt返回'?'。如果命令行包括在optstring中,但是缺少必要的参数,而且optstring的第一个字符是":",则此时返回的就是":"(默认为"?"),我们可以输出此值作为诊断信息。
函数说明:
getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring则代表欲处理的选项字符串。此函数会返回在argv中下一个的选项字母,此字母会对应参数optstring中的字母。如果选项字符串里的字母后面接着冒号":",则表示还有相关的参数,全局变量optarg即会指向此额外参数。如果getopt()找不到符合的参数则会打印出错信息,并将全局变量optopt设为"?"字符。如果不希望getopt()打印出错信息,则只要将opterr设为0即可。
短参数的定义:
getopt()使用optstring所指的字串作为短参数列表,像"1ac:d::"就是一个短参数列表。短参数的定义是一个'-'后面跟一个字母或数字,像-a,-b就是一个短参数。每个数字或字母定义一个参数。
其中短参数在getopt()定义里分为三种:
1、不带值的参数,它的定义即是参数本身;
2、必须带值的参数,它的定义是在参数本身后面再加一个冒号;
3、可选值的参数,它的定义是在参数本身后面加两个冒号;
在这里拿上面的"1ac:d::"作为样例进行说明,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。
在实际调用中,"-1 -a -c cvalue -d","-1 -a -c cvalue -ddvalue","-1a -ddvalue -c cvalue"都是合法的。这里需要注意三点:
1、不带值的参数可以连写,像1和a是不带值的参数,可以-1 -a分开写,也可以-1a或-a1连写。
2、参数不分先后顺序,"-1a -c cvalue -ddvalue","-ddvalue -c cvalue -a1"的解析结果是一样的。
3、要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析出错。
返回值:
getopt()每次调用会逐次返回命令行传入的参数。
当没有参数的最后的一次调用时,getopt()将返回-1。
当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回"?"。
当optstring是以":"开头时,缺值参数的情况下会返回":",而不是"?"。
#include <unistd.h>
#include <stdio.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 ch;
while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)
{
printf("optind: %d ", optind);
switch (ch)
{
case 'a':
printf("HAVE option: -a ");
break;
case 'b':
printf("HAVE option: -b ");
printf("The argument of -b is %s ", optarg);
break;
case 'c':
printf("HAVE option: -c ");
printf("The argument of -c is %s ", optarg);
break;
case 'd':
printf("HAVE option: -d ");
break;
case 'e':
printf("HAVE option: -e ");
printf("The argument of -e is %s ", optarg);
break;
case '?':
printf("Unknown option: %c ",(char)optopt);
break;
}
}
}