Linux环境下C语言getopt函数的详细解析

别等时光非礼了梦想. 提交于 2020-03-03 07:11:40

该函数在头文件getopt.h中。

函数原型:

int getopt(int argc,char * const argv[ ],const char * optstring);

返回值为int类型,其实解析成功一个选项时(可能这时看不懂,没关系,后面会解释)这个返回的就是一个字符,因为字符可以转为整数。
若解析完毕,则返回-1。

前两个参数大家都知道,就是main函数的参数选项:argc是参数个数,argv是参数的字符串数组(不要忘记argv[0]是"./可执行文件名")。而第三个参数就是选项字符串

什么是选项字符串选项大家都知道,比如:

gcc -o test test.c
gcc -v

上面的-o-v就是选项,其中-o是带参数的选项,其参数为test,而-v是不带参数的选项。
那么说了这么多,选项字符串其实就是一定格式的字符串,它决定了传给程序的参数argv中可以有哪些选项,而这些选项中哪些可以有参数。然后运行程序时,getopt函数对argv进行解析,依次返回成功解析的选项,解析完毕后返回-1。

举个例子:选项字符串给定:“ab:c::”,那么说明运行程序可以给最多三个参数,分别为-a,-b-c
其中-a,因为没有后跟冒号是不可以有参数的;
-b,因为后跟了一个冒号,是必须有参数的,参数可以有两种形式:

  1. -b100,即参数紧跟选项。
  2. -b 100,即选项与参数以空格分隔。

-c,因为后跟了两个冒号,参数可有可无,且若有参数,参数必须紧跟选项,如-c200

我们还需了解这个函数相关的全局变量,我们在写程序时需加上他们:

  • char* optarg:指向目前解析的选项的参数
  • int optind:指向下一个选项的下标索引,如./test -a 1 -b 2,最初还未解析时,optind为1,因为-a的下标为1,解析完-aoptind的值就变为3,因为-b的下标为3,解析完-b后,optint变为5,但argv[5]为空,说明解析完毕,此时getopt函数便返回-1。
  • int opterr:这个值在非0时会将错误信息标准输出到显示屏,但若被设为0,将不会输出错误信息。
  • int optopt:若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符,同时将optopt设为该选项

关于这个函数的重点信息都介绍完了,现在就来看个简单的例子帮助理解吧(一定要理解注释!!!):

//注:此源代码来自于CMU 15-213 Recitation 6,侵删
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>   //记得包含头文件!

int main(int argc, char *argv[]) {
	
	extern char *optarg;     //这两行就是我们所说的,需要在程序中加入的关于getopt函数的全局变量
	extern int optind, opterr, optopt;
	
    int verbose = 0;    //一个输出的判断条件
    int n = 0;     //用于计数
    char opt;      //用于存getopt函数的返回值

	//下面循环的判断条件中,选项字符串为:vn:,意思是选项-v没有参数,-n必须有参数
	//一直循环直到解析完毕
    while ((opt = getopt(argc, argv, "vn:")) != -1) {    
        switch (opt) {    
            case 'v':      //若解析到的返回值是v,即选项-v且没加参数
                verbose = 1;      //将输出判断条件置1
                break;
            case 'n':     //若解析到的返回值为n,即选项-n且加了参数
                n = atoi(optarg);     //将选项-v的参数字符串转为整数
                break;
            default:       //若由于出错返回值是其他(比如返回上述的?)
                fprintf(stderr, "usage: …");    //标准错误输出
                exit(1);         //并异常退出程序
        }
    }
    int i;
    for (i = 0; i < n; i++) {         //根据解析结果得到的n和verbose输出
        if (verbose) printf("%d\n", i);
    }

    printf("Done counting to %d\n", n);

    return 0;
}

若我们在终端输入以下命令运行程序:

./getopt_example -v -n5

则会得到以下结果:

0
1
2
3
4
Done counting to 5

测试下错误输入,如加入不存在的选项-p

./getopt_example -v -n5 -p

则会异常退出:

./getopt_example: invalid option -- 'p'
usage: …% 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!