• getopt函数详解(事例)


    在Linux中,用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题,例如:./a.out -a1234 -b432 -c -d
    程序会根据读取的参数执行相应的操作,在C语言中,这个功能一般是靠getopt()这个函数,结合switch语句来完成的,首先来看下面的代码:

    #include <stdio.h>
    #include <unistd.h>
    int main(int argc,char *argv[])
    {
      int ch;
      opterr=0;
      while((ch=getopt(argc,argv,"a:b::cde"))!=-1)
      {
        printf("optind:%d ",optind);
        printf("optarg:%s ",optarg);
        printf("ch:%c ",ch);
        switch(ch)
        {
          case 'a':
            printf("option a:%s ",optarg);
            break;
          case 'b':
            printf("option b:%s ",optarg);
            break;
          case 'c':
            printf("option c ");
            break;
          case 'd':
            printf("option d ");
            break;
          case 'e':
            printf("option e ");
            break;
          default:
            printf("other option:%c ",ch);
        }
        printf("optopt %c ",optopt);
      }
      return 0;
    }

    用gcc编译后,在终端行执行以上的命令:
    ./a.out -a1234 -b432 -c -d
    则会有如下的输出:
    optind:2
    optarg:1234
    ch:a
    option a:1234
    optopt 


    optind:3
    optarg:432
    ch:b
    option b:432
    optopt 

    optind:4
    optarg:(null)
    ch:c
    option c
    optopt 

    optind:5
    optarg:(null)
    ch:d
    option d
    optopt

    要理解getopt()函数的作用,首先要清楚带参数的main()函数的使用:main(int argc,char *argv[])中的argc是一个整型,argv是一个指针数组,argc记录argv的大小。上面的例子中:
    argc=5;
    argv[0]=./a.out
    argv[1]=-a1234
    argv[2]=-b432
    argv[3]=-c
    argv[4]=-d
    getopt()函数的原型为getopt(int argc,char *const argv[],const char *optstring)。其中argc和argv一般就将main函数的那两个参数原样传入。optstring是一段自己规定的选项串,例如本例中的"a:b::cde",表示可以有,-a,-b,-c,-d,-e这几个参数。":"表示必须该选项带有额外的参数,全域变量optarg会指向此额外参数,"::"标识该额外的参数可选。全域变量optind指示下一个要读取的参数在argv中的位置。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为"?"字符。如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。

  • 相关阅读:
    C++ 三数之和
    C++ 保存读取二进制
    流媒体 Ubuntu部署srs、windows部署nginx
    sql函数(三)MERGE INTO函数
    sql函数(二)LISTAGG()函数(列转行函数)
    sql函数(一)ROW_NUMBER() OVER()--表内分组并排序
    java注释(类、构造函数、方法、代码块、单行、属性注释)
    springBoot注解整理
    @DateTimeFormat与@JsonFormat作用
    DataJPA简述与注解
  • 原文地址:https://www.cnblogs.com/liqiu/p/2968526.html
Copyright © 2020-2023  润新知