基于Linux下的getopt()/getopt_long()函数进行参数解析

getopt/getopt_long函数进行参数解析

1.参数原型

getopt()函数的参数原型

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

getopt_long()函数的参数原型

int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

getopt函数只能处理短选项,而getopt_long函数两者都可以。通常情况下我们都是使用getopt_long()函数。

2.参数和返回值分析

  1. argc, argv参数和main()函数的参数一致,这里就不做过多介绍。

  2. optstring: 表示短选项字符串。且规范格式如下:
    1)单个字符为参数选项
    2)选项字符后面跟“:”,表示该选项必须具备参数,参数与选项之间必须有空格分隔, 如:start -f flile。
    3)选项字符后面跟“::”, 表示该选项必须具备参数,且参数紧跟选项,二者连在一起,例如:start -ffile 。

  3. struct option* longopts:长选项结构体,保存长选项的信息。

struct option
{
    const char *name;
    int has_arg;
    int *flag;
    int val;
}

1)name:长选项的名字
2)has_arg:如果选项不带参数,则值为no_argument(或0);如果选项需要参数,则值为required_argument (或 1);或者如果选项接受可选参数,则值为optional_argument(或2)。
3) flag:指定如何返回长选项的结果。如果标志为空,则getopt_long()返回参数val的值(例如调用程序可能会将val设置为等效的短选项字符。)否则,getopt_long()返回0,flag指向一个变量,该变量设置为参数val的值;
4) val:要返回的值,或加载到flag参数指向的变量中的值
5) 该结构体的最后一个元素必须用0来填充

  1. longindex:如果longindex不为空,则指向一个变量,该变量设置为长选项相对于longopts的索引(即数组的下标值)。
  2. 返回值
    1)如果短选项找到,那么将返回短选项对应的字符。
    2)如果长选项找到,如果flag为NULL,返回val。如果flag不为空,返回0
    3)如果遇到一个选项没有在短字符、长字符里面。或者在长字符里面存在二义性的,返回“?”
    4)如果解析完所有字符没有找到(一般是输入命令参数格式错误,eg: 连斜杠都没有加的选项),返回“-1”
    5)如果选项需要参数,忘了添加参数。返回值取决于optstring,如果其第一个字符是“:”,则返回“:”,否则返回“?”。

3.代码示例

struct option      long_options[] = 
{
     {"daemon", no_argument, NULL, 'b'},
     {"port", required_argument, NULL, 'p'},
     {"help", no_argument, NULL, 'h'},
     {NULL, 0, NULL, 0}
};
opt = getopt_long(argc, argv, "bp:h", long_options, NULL)
   if(opt == -1)
   break;
switch(opt)
{
 case 'b':
       daemon_run = 1;
       break;
 case 'p':
       serv_port = atoi(optarg);
       break;
 case 'h':
       print_usage(progname);
       return EXIT_SUCCESS;
 default:
       break;    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章