zoukankan      html  css  js  c++  java
  • getopt函数

    函数getopt()用来分析命令行参数,其函数原型和相关变量声明如下:

            #include <unistd.h>
            extern char *optarg; 
            extern int optind,  // 初始化值为1,下一次调用getopt时,从optind存储的位置重新开始检查选项。 
            extern int opterr,  // 初始化值为1,当opterr=0时,getopt不向stderr输出错误信息。
            extern int optopt;  // 当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,
                                        // 该选项存储在optopt中, getopt返回'?’。
            int getopt(int argc, char * const argv[], const char *optstring);        optarg和optind是两个最重要的external 变量。optarg是指向参数的指针(当然这只针对有参数的选项);optind是argv[]数组的索引,众所周知,argv[0]是函数名称,所有参数从argv[1]开始,所以optind被初始化设置指为1。        每调用一次getopt()函数,返回一个选项,如果该选项有参数,则optarg指向该参数。 在命令行选项参数再也检查不到optstring中包含的选项时,返回-1。所以说如果想检查输入的参数的个数是不是满足程序员的要求。可以用这个函数来判断。

            函数getopt()有三个参数,argc和argv[]应该不需要多说,下面说一下字符串optstring,它是作为选项的字符串的列表。
            函数getopt()认为optstring中,以'-’开头的字符(注意!不是字符串!!)就是命令行参数选项,有的参数选项后面可以跟参数值。optstring中的格式规范如下:
    1) 单个字符,表示选项,
    2) 单个字符后接一个冒号”:”,表示该选项后必须跟一个参数值。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
    3) 单个字符后跟两个冒号”::”,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
            例如optstring="ab:c::d::",程序名称为test.ext,在命令行下运行该程序:(ab前面没有:或者::这样的变态符号,所以ab之后没有参数是可以的。但是C前面有一个:,所以呢C后面需要参数,可以用空格隔开,也可以紧跟,“::”表示必须进更,我想大家还是为了清楚,所以都是 potions 空格parameters这样的格式的啦。)

            test.exe -a -b host -ckeke -d haha
            在这个命令行参数中,-a和-h就是选项元素,去掉'-',a,b,c就是选项。host是b的参数,keke是c的参数。但haha并不是d的参数,因为它们中间有空格隔开。所以上面的命令行调用会出错。 
            默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后。例如:

            test.exe -a ima -b host -ckeke -d haha        最后命令行参数的顺序是: -a -b host -ckeke -d ima haha
            如果optstring中的字符串以'+'加号开头或者环境变量POSIXLY_CORRE被设置。那么一遇到不包含选项的命令行参数,getopt就会停止,返回-1。 
        对getopt()函数的使用,通常用一个循环,不断的调用它,获得其参数选项以及参数值(如果有的话),直到取完最后一个命令行参数(getopt()函数返回值为-1)。并且,为了防止用户不按照要求进行命令行输入,会设计一个help选项,以告知用户如何使用命令行运行该程序)。

    如下是一个例子,仅仅只是个框架,

    int main(int argc, char *argv[]){
     
     int opt;

     while((opt = getopt(argc, argv, "d:gsa:v:t")) != -1){
      switch(opt){
       case 'd':
        /*do something*/
        break;
       case 'g':
        /*do something*/
        break;
       case 's':
        /*do something*/
        break;
       case 'a':
        /*do something*/
        break;
       case 'v':
        /*do something*/
        break;
       case 't':
        /*do something*/
        break;
       case '?':
        /*do something*/
        break;
      }
     }

    }

  • 相关阅读:
    关于JSON可能出现的错误,待更/todo
    mongoose的安装与使用(书签记录) 2017
    HTTP的学习记录3--HTTPS和HTTP
    HTTP的学习记录(二)头部
    HTTP(一)概述
    LeetCode 455. Assign Cookies
    LeetCode 453. Minimum Moves to Equal Array Elements
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 447. Number of Boomerangs
    LeetCode 416. Partition Equal Subset Sum
  • 原文地址:https://www.cnblogs.com/chonghui1001/p/2236562.html
Copyright © 2011-2022 走看看