C语言getopt函数的详细解析

1、头文件

#include <getopt.h>
#include <stdlib.h>
#include <unistd.h>

2、函数原型

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

返回值为int类型,其实解析成功一个选项时,这个返回的就是一个字符,因为字符可以转为整数。
若解析完毕,则返回-1或者EOF。

前两个参数是main函数的参数选项:

     argc是参数个数;

     argv是参数的字符串数组(不要忘记argv[0]是"./可执行文件名");

     而第三个参数optstring就是选项字符串。

3、选项字符串

gcc -o test test.c
gcc -v

上面的-o、-v就是选项,其中-o是带参数的选项,其参数为test,而-v是不带参数的选项。
那么说了这么多,选项字符串其实就是一定格式的字符串,它决定了传给程序的参数argv中可以有哪些选项,而这些选项中哪些可以有参数。

然后运行程序时,getopt函数对argv进行解析,依次返回成功解析的选项,解析完毕后返回-1。

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

-b100,即参数紧跟选项。
-b 100,即选项与参数以空格分隔。
而-c,因为后跟了两个冒号,参数可有可无,且若有参数,参数必须紧跟选项,如-c200。
4、函数全局变量

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

5、举例

//注:此源代码来自于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);     //将选项-n的参数字符串转为整数
                break;
            default:       //若由于出错返回值是其他(比如返回上述的?)
                fprintf(stderr, "usage: …");    //标准错误输出
                exit(1);         //并异常退出程序
        }
    }
    int i;
    for (i = 0; i < n; i++) {         //根据解析结果得到的n和verbose输出
        if (verbose) printf("%d
", i);
    }

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

    return 0;
}
./getopt_example -v -n5
结果:
0
1
2
3
4
Done counting to 5

参考:

https://blog.csdn.net/weixin_44009743/article/details/104613599

原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/15023341.html