命令行参数解析函数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版)
- 命令行参数解析函数getopt_long() 使用详解
- getopt_long()----命令行参数解析函数使用详解
- 命令行参数解析函数getopt_long()
- 命令行参数解析函数:getopt和getopt_long
- getopt_long()解析命令行选项参数
- getopt_long 解析命令行参数(--help)
- 解析命令行的getopt_long()函数
- 命令行参数选项处理:getopt()及getopt_long()函数使用
- 程序参数解析函数使用getopt_long()函数,改编自webbench
- 命令行参数解析: getopt()与getopt_long()
- 命令行参数解析: getopt()与getopt_long()
- 命令行参数解析: getopt()与getopt_long()
- linux 中解析命令行参数 (getopt_long用法)
- linux 中解析命令行参数(getopt_long用法)
- 命令行参数解析: getopt()和getopt_long()
- linux 中解析命令行参数(getopt_long用法)
- linux中解析命令行参数(getopt_long用法)
- linux 中解析命令行参数 getopt_long
- valgrind 检查内存泄漏
- STM32之usart
- 第十一周上机实践项目 项目2-储存班长的学生信息类(2)
- 第十一周上机实践项目 项目2-储存班长的学生信息类(2)
- UVa 1586 Molar Mass
- 命令行参数解析函数getopt_long() 使用详解
- Hibernate 入门 练习
- 使用 HTML5 WebSocket 构建实时 Web 应用
- leetcode #17 in cpp
- gcc arm-linux-gcc编译优化
- 请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function?
- 定时器设置
- LeetCode 62. Unique Paths(唯一路线)
- 为什么每次提交代码都需要add或modify一点日志?