getopt函数使用

函数原型

#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
注意:当使用长选项时需要用"--"否则会出错。
```
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值