getopt_long的使用心得

在看一个看开源的代码的时候,看到了一个选项参数的操作,里面用到了getopt_long这个函数,发现这个函数真的蛮不错的,对长选项或短选项处理的很好。

1.结构体

struct option
{ 
        const char* name;
        int has_arg; 
        int   *flag;
        int val; 
}
name是长选项的名字,has_arg值为0、1、2,分别表示没有参数、有参数、参数可选,flag如果为NULL,函数返回val的值,否则将val的值写入flag指向的变量中,一般情况下,如果flag为NULL,则val的值为该长选项对应的短选项。或者说 每一个结构体包含4个域,第一个域为长选项字符串(--help),第二个域是一个标识,只能为0、1或2,分别代表没有、有和可选。第三个域永远为NULL。第四个域为对应的短选项字符串(-h)。

例如:

struct option long_options[]={
        { "port",       1,   NULL,    'p'     },  
        { "file",       1,   NULL,    'f'     },  
        { "help",       0,   NULL,    'h'     },  
        {      0,     0,     0,     0},  
};

2.一个字符串

这个字符串,包括所需要的短选项字符,如果选项后有参数,字符后加一个":"符号。本文中,这个字符串应该为"p:f:h"。(因为-p -f后面有参数,所以字符后面要加":")

每次调用getopt_long,它会解析一个符号,返回相应的短选项字符,如果解析完毕返回-1。所以需要使用一个循环来处理所有的参数,而相应的循环里会使用switch语句进行选择。如果getopt_long遇到一个无效的选项字符,它会打印一个错误消息并且返回'?',很多程序会打印出帮助信息并且中止运行;当getopt_long解析到一个长选项并且发现后面没有参数则返回':',表示缺乏参数。当处理一个参数时,全局变量optarg指向下一个要处理的变量。当getopt_long处理完所有的选项后,全局变量optind指向第一个未知的选项索引。

示例代码:

#include<stdio.h> #include<getopt.h> char *l_opt_arg; char *const short_options="p:f:h"; struct option long_options[]={ { "port", 1, NULL, 'p' }, { "file", 1, NULL, 'f' }, { "help", 0, NULL, 'h' }, { 0, 0, 0, 0}, }; int main(int argc,char *argv[]) { int c; int option_index=0; while((c = getopt_long (argc, argv, short_options, long_options, &option_index)) != -1) { switch (c){ case 'p': l_opt_arg = optarg; printf("the port is %s\n",l_opt_arg); break; case 'f': l_opt_arg = optarg; printf("the file name is %s\n",l_opt_arg); break; case 'h': printf("./getopt_long [option] ... file ...\n"); printf("-p, --port set the port \n"); printf("-f, --file set the file will be sent\n"); printf("-h, --help for more help\n"); break; default: break; } } return 0; } 






你可能感兴趣的:(linux)