您的位置:首页 > 运维架构 > Linux

getopt_long函数基本用法-linux

2013-08-06 13:34 441 查看
一、感性认识:

[c-sharp] view
plaincopy

#include <stdio.h>  

#include <getopt.h>  

char *
l_opt_arg;  

char * const short_options = "nbl:"; //单冒号表示是否带有参数[l带有参数后面加冒号] 

struct option long_options[] = {  

     { "name",     0,   NULL,    'n'     },  

     { "bf_name",  0,   NULL,    'b'     },  

     { "love",     1,   NULL,    'l'     },  

     {      0,     0,     0,     0},  

};  

/* 

长选项我们用一个option结构体数组表示长选项的信息:

第一项:表示长选项的名字。

第二项:用来决定此长选项是否要带参数。[这里用数值表示]

第三项:我们一般都置为NULL,用来决定getopt_long函数的返回值就是第四个选项的值

第四项:是此长选项相对应的短选项值,因此一旦此函数读到此长选项时,就返回与此长选项相对应的短选项

*/

int main(int argc, char *argv[])  

{  

     int c;  

     while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)  

     {  

         switch (c)  

         {  

         case 'n':  

             printf("My name is XL./n");  

             break;  

         case 'b':  

             printf("His name is ST./n");  

             break;  

         case 'l':  

             l_opt_arg = optarg;  //optarg代表参数

             printf("Our love is %s!/n", l_opt_arg);  

             break;  

         }  

     }  

     return 0;  

}  

编译:

[root@localhost liuxltest]# gcc -o getopt getopt.c

运行1:

[root@localhost liuxltest]# ./getopt
-n -b -l
forever(这个是参数

My name is XL.

His name is ST.

Our love is forever!

运行2:

[root@localhost liuxltest]# ./getopt
-nb -l
forever

My name is XL.

His name is ST.

Our love is forever!

运行3:

[root@localhost liuxltest]# ./getopt
-nbl
forever  

My name is XL.

His name is ST.

Our love is forever!

二、概念

getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下:

#include <getopt.h>
int
getopt_long(int
argc, char * const
argv[],

const char *optstring,

const
struct option *longopts,
int *longindex);

说明:
argc和argv通常直接从main()到两个参数传递而来。
optsting
是选项参数组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。
longopts 是指向数组的指针,这个数组是

 struct option {

              const char *name;

              int has_arg;

              int *flag;

              int val;

    };

const char *name:

选项名,前面没有短横线。譬如"help"、"verbose"之类。

int has_arg:

描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:

符号常量
                         数值           
含义

no_argument                 0                 选项没有参数

required_argument      1                 选项需要参数

optional_argument      
2                 选项参数是可选的

int *flag:

如果该指针为NULL,那么getopt_long返回val字段的值;

如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0

int val:

如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;

longindex
一般赋为NULL即可;如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。

几种常用返回值:

1、每次调用该函数,它都会分析一个选项,并且返回它的短选项,如果分析完毕,即已经没有选项了,则会返回-1。

2、如果getopt_long()在分析选项时,遇到一个没有定义过的选项,则返回值为‘?’,此时,程序员可以打印出所定义命令行的使用信息给用户。

3、当处理一个带参数的选项时,全局变量optarg会指向它的参数

4、当函数分析完所有参数时,全局变量optind(into argv)会指向第一‘非选项’的位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: