函数原型
#include<getopt.h>
getopt(int argc,char *argv,char *str);
这个函数的作用和main(argc,argv)相似来接收终端传递来的参数,不过这个函数比main函数有更大的优点,通常传递参数和值的时候使用这个比如 "-a 6 -t 7"这种类型的参数。
这个函数的第一个和第二个参数都是从main函数中得到的参数,第三个参数表示所有可能的选型,比如 “abc” 便可以识别 “-a 3 -b 6"等类型的参数,这个参数可以为”:bc"表示a选型
的后面必须有值,通常使用下面的形式来遍历所有的选型。
while((opt=getopt(argc,argv,"a:bc"))!=-1)
{
switch(opt){
case 'a': 处理函数 break;
case 'b': 处理函数 break;
case 'b': 处理函数 break;
}
}
和这个函数有关的还有下面呢两个全局变量optind和optarg。
- optind表示下一个选项的下表
- optarg表示选项的值
下面是一个例子来让我们使用一下这个函数
#include<stdio.h>
#include<getopt.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int opt;
while((opt=getopt(argc,argv,"a:b:c:"))!=EOF)
{
switch(opt){
case 'a': printf("a index %d %s %s\n",optind,argv[optind],optarg); break;
case 'b': printf("b index %d %s %s\n",optind,argv[optind],optarg); break;
case 'c': printf("c index %d %s %s\n",optind,argv[optind],optarg); break;
}
}
}
结果:
root@ubuntu:/home/sun/project/test# ./getopt3 -a 2 -b fdv -c sad
a index 3 -b 2
b index 5 -c fdv
c index 7 (null) sad
后面三个表示下一个选项的下表,下一个选项和这个选项的值
可以看到第三个记录有一个null这个因为当执行到最后一个时,没有下一个选项,但是可以看到optind为7等于argc
#include <getopt.h>
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
getopt函数只能处理短的选项,getopt_long可以处理长选项,比getopt多了两个参数一个是const struct option *longopts,这个参数是一个结构指针,我们来详细讲解这个结构。
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
- name表示选项的长名字
- has_arg有三个值no_argument (表示参数后面没有值),required_argument(表示参数后面有参数值) ,optional_argument(参数后面两个值)。
- flag是一个指针,当flag为NULL时,这个函数的返回值为val(结构的第四个参数)。当不为NULL时返回0。
- val和flag共同决定了getopt_long的返回值。
- 需要注意的是getopt_long和getopt最后一个是返回-1。
- getopt_long函数的最后一个参数表示遍历到struct option的下标,和optind是不一样的。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<getopt.h>
int main(int argc,char *argv[])
{
int str;
struct option long_option[]={
{"add",required_argument,&str,1},
{"delet",required_argument,&str,2},
{"crete",required_argument,&str,3},
{"0",0,0,0}
};
int c;
int option_index;
while((c=getopt_long(argc,argv,"e:f:g:",long_option,&option_index))!=-1)
{
switch(c){
case 'e':printf("-%c %s\n",c,optarg);break;
case 'f':printf("-%c %s\n",c,optarg);break;
case 'g':printf("-%c %s\n",c,optarg);break;
case 0 :printf("-%s %s\n",long_option[option_index].name,optarg);break;
};
}
}
结果:
root@ubuntu:/home/sun/project/test# ./getopt_long -e e -f f -g g --delet sa --add 33 --crete creat
-e e
-f f
-g g
-delet sa
-add 33
-crete creat
注意:当使用长选项时需要用"--"否则会出错。
```