命令行参数解析函数getopt_long() 使用详解

来源:互联网 发布:软件测试日报 知乎 编辑:程序博客网 时间:2024/05/18 01:52

当一个用C语言编写的Linux或UNIX程序运行时,它是从main函数开始的。对这些程序而言,main函数的声明如下所示:

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

其中argc是程序参数的个数(int),argv是一个代表参数自身的字符串数组(char **)。无论操作系统何时启动一个新程序,参数argc和argv都被设置并传递给main。这些参数通常由另一个程序提供,这个程序一般是shell,它要求操作系统启动该新程序。shell接收用户输入的命令行,将命令行分解成单词,然后把这些单词放入argv数组。

例如,如果我们给shell输入如下命令:

$myprog left right 'and center'

程序myprog将从main函数开始,main带的参数是:
argc: 4
argv: {“myprog”, “left”, “right”, “and center”}
注意:参数个数包括程序名自身,argv数组也包含程序名并将它作为第一个元素argv[0]。因为我们在shell命令里使用了引号,所以第四个参数是一个包含了空格的字符串。

人们常常希望使用命令行参数向程序传递信息,许多工具程序也使用命令行参数来改变程序的行为或设置选项。通常,你可以使用以短横线(-)开头的命令行参数来设置这些所谓的标识(flag)或开关(switch)。我们建议在应用程序中,所有的命令行开关都应以一个短横线开头,其后包含单个字母或数字。如果需要,不带后续参数的选项可以在一个短横线后归并到一起,如:ls -lstr。

在编程的时候,当命令行参数个数较多时,如果按照顺序一个一个定义参数含义很容易造成混乱;如果程序只按顺序处理参数的话,一些“可选参数”的功能将很难实现。为了解决此类问题,GNU C库提供了函数以简化C/C++程序中的解析工作。

注:Linux系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C 对标准C进行进一步扩展,以增强标准C的功能。函数getopt_long能够同时处理长短两种格式的选项,要使用这个函数,请包含头文件

getopt_long(int argc, char* argv[], const char *optstring, const struct option *longopts, int *longindex);
  • 参数optstring:负责处理短参数。也称为选项指定符字符串,该字符串告诉getopt哪些选项可用,以及它们是否有关联值。optstring只是一个字符列表,每个字符代表一个单字符选项。如果一个字符后面紧跟一个冒号,则表明该选项有一个关联值作为下一个参数。

optstring的格式举例说明比较方便,例如:
char *optstring = “abcd:”;
上面这个optstring在传入之后,getopt函数将依次检查命令行是否指定了 -a, -b, -c及 -d(这需要多次调用getopt函数,直到其返回-1),当检查到上面某一个参数被指定时,函数会返回被指定的参数名称(即该字母)
最后一个参数d后面带有冒号,: 表示参数d是可以指定值的,如 -d 100 或 -d user。

  • 参数longopts:负责处理长参数。指向一个由option结构体组成的数组,那个数组的每一个元素都指明了一个长参数(形如”–name”的参数)名称和性质:
 struct option {               const char *name;               int         has_arg;               int        *flag;               int         val;           };

name:参数名称

has_arg:指明是否带参数值,其数值可选:

no_argument(即 0)表明这个长参数不带参数(即不带数值,如:--name)required_argument (即 1) 表明这个长参数必须带参数(即必须带数值,如:--name Bob)optional_argument(即 2)表明这个长参数后面带的参数是可选的,(即--name和--name Bob均可)

flag:设置为NULL表示当找到该选项时,getopt_long返回在成员val里给出的值。否则,getopt_long返回0,并将val的值写入flag指向的变量。

val:getopt_long为该选项返回的值。

  • 参数longindex:如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值。

外部变量optarg:在getopt_long循环处理选项时,如果选项有一个关联值,则外部变量optarg指向这个值。


参考链接:

[1] http://blog.csdn.net/cashey1991/article/details/7942809

[2] Linux程序设计(第4版)

0 0