C:getopt関数

1.getopt関数の説明

#include<unistd.h>
extern char *optarg;
extern int optind, opterr, optopt;
int getopt(int argc, char * const argv[], const char *optstring)
/* *
 * @作用:是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,其格式如下:
 *   cmd [-a][-b] 对短选项的解析
 *   cmd [-a argument_a][-b argument_b] 对短选项及短选项的参数解析
 *   cmd [-a[argument_a]] 选项a长度参数也是可选的情况解析
 * @参数说明:
 *   argc,argv:为调用main函数时传入的参数。传入的‘-’开始的字符被解析为选项,getopt一次执行解析出一个
 * option,如果循环执行,可以将argv中的全部option解析出来;
 *   optstring:指定选项合法的选项,一个字符代表一个选项,在字符后面接一个‘:'表示该选项带一个参数,字符
 * 后带两 个‘:’表示该选项带可选参数(参数可有可无)若有参数,用optarg指向该参数,否则optarg为0;
 * 
 * @返回值:
 *   int,函数返回值,有以下几种情况:
 *        1. 传入的argv所有参数已经被解析完成,getopt函数返回-1;
 *        2. 如果argv中解析出optstring中描述的选项字符,则返回该字符,如果该选项指定了参数,
 *           则全局变量optarg指向该参数
 *        3. 如果getopt遇到一个非optstring指定的选项字符,这表示该选项是未识别的,返回'?',
 *           并且将该选项存放到全局变量optopt中
 *        4. 如果optstring指定了选项必须带参数,但传入的相应option丢失了参数,返回值依赖于
 *           optstring的第一个字符,若第一个字符是':',返回':',否则返回'?';由于非法的选项
 *           返回也是'?',所以常常optstring的第一个字符指定为':';同时将该选项存放到全局变量
 *           optopt中
 * 
 * @extern 变量说明:
 *   optarg:用来保存选项的参数
 *   optind:记录下一个检索的位置
 *   opterr:是都将错误信息输出到stderr,0为不输出到stderr中
 *   optopt:不在选项字符串optstring中的选项
 * 
 * @选项字符串实例:
 *   “a:bd::”
 *     该字符串为一个选项字符串,其对应的命令就是-a, -b, -d。其中a后面是要必须跟一个参数,没有参
 *   数是会报错的,该参数可以和-a连在一起,也可以用空格隔开(-a123 or -a 123);b后面是不需要跟参
 *   数的;-d后面可以跟参数也可以不用跟参数,但需要注意有参数时,参数和选项之间不能有空格,否则认为
 *   无参数;
 *     总结:一个冒号表示后面必须跟一个参数,可以用空格或不用空格隔开选项和参数;两个冒号表示选项后
 *   面可以跟参数也可以不跟参数,若要跟参数,必须要和选项连在一起。
 */

2.コード例

//GetOpt.cpp
#include <unistd.h>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    
    
  int ret = -1;

  for(int i = 0; i < argc; ++i)
  {
    
    
    cout << argv[i] << " ";
  }
  cout << endl;

  extern char* optarg;
  extern int optind, opterr, optopt;
  /* *
   * @"t:h::f":
   *   选项-t:需要带一个参数
   *   选项-h:可以带参数也可以不带参数
   *   选项-f:不用带参数
   * */
  while(-1 != (ret = (getopt(argc, argv, "t:h::f"))))
  {
    
    
    switch(ret){
    
    
      case 'f':
        cout << "option: " << (char)ret  << endl;
        break;
      case 't':
        cout << "option: " << (char)ret << ", arg: " << optarg << endl;
        break;
      case 'h':
	    if(optarg)
          cout << "option: " << (char)ret << ", arg: " << optarg << endl;
        else
          cout << "option: " << (char)ret << ", not add param"<< endl;
        break;
      case '?':
        cout << "not has option: " << (char)optopt << endl;
        break;
    }
  }
  return 0;
}

コンパイル

g++ GetOpt.cpp -o opt

エグゼクティブの指示

1./opt -t 90 -h100 -f
	结果打印:
		option: t, arg: 90
		option: h, arg: 100
		option: f
2./opt -t90 -h 100 -f
	结果打印:
		option: t, arg: 90
		option: h, not add param
		option: f
	说明: -h和参数100中间有空格,所以检测不到其后面的参数
	
3./opt -t90 -h 100 -f -d 
	结果打印:
		option: t, arg: 90
		option: h, not add param
		option: f
		./opt: invalid option -- 'd'
		not has option: d
	说明: -d不在optstring选项中,故报错,认为是无效的选项

おすすめ

転載: blog.csdn.net/CFH1021/article/details/105774894