zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    知识点复习
    【程序人生】一个IT人的立功,立言,立德三不朽
    【朝花夕拾】Android多线程之(三)runOnUiThread篇——程序猿们的贴心小棉袄
    【朝花夕拾】Android多线程之(二)ThreadLocal篇
    【朝花夕拾】Android多线程之(一)View.post()篇
    Camera2笔记
    HangFire多集群切换及DashBoard登录验证
    Linq 动态多条件group by
    Api接口签名验证
    postgre ||连接字段
  • 原文地址:https://www.cnblogs.com/ggzhangxiaochao/p/15023341.html
Copyright © 2011-2022 走看看