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

 

posted @ 2019-04-08 17:04  HenryLiuY  阅读(1838)  评论(0)    收藏  举报