getopt函数使用

函数原型

#include
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
#include
#include
#include
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 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
#include
#include
#include
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
注意:当使用长选项时需要用"--"否则会出错。
```


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部