当前位置:  编程技术>c/c++/嵌入式

详细解析命令行的getopt_long()函数

    来源: 互联网  发布时间:2014-10-20

    本文导语:  头文件 #include 函数原型int getopt_long(int argc,char * const argv[],const char *optstring,const struct option *longopts,int *longindex) 函数说明getopt被用来解析命令行选项参数。getopt_long支持长选项的命令行解析,函数中的参数argc和argv通常直接从main()...

头文件
#include

函数原型
int getopt_long(int argc,char * const argv[],const char *optstring,const struct option *longopts,int *longindex)

函数说明
getopt被用来解析命令行选项参数。
getopt_long支持长选项的命令行解析,函数中的参数argc和argv通常直接从main()的两个参数传递而来。optstring是选项参数组成的字符串。

字符串optstring可以下列元素:
1. 单个字符,表示选项,

2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。

3. 单个字符后跟两个冒号,表示该选项后可以有参数也可以没有参数。如果有参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
optstring是一个字符串,表示可以接受的参数。例如,"a:b:cd",表示可以接受的参数是a,b,c,d,其中,a和b参数后面跟有更多的参数值。(例如:-a host --b name)。

参数longopts,其实是一个结构的实例:

代码如下:

struct option {
const char *name; //name表示的是长参数名
int has_arg; //has_arg有3个值,no_argument(或者是0),表示该参数后面不跟参数值
// required_argument(或者是1),表示该参数后面一定要跟个参数值
// optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值
int *flag;
//用来决定,getopt_long()的返回值到底是什么。如果flag是null,则函数会返回与该项option匹配的val值
int val; //和flag联合决定返回值
}

给个例子:
代码如下:

struct option long_options[] = {
{"a123", required_argument, 0, 'a'},
{"c123", no_argument, 0, 'c'},
}

现在,如果命令行的参数是-a 123,那么调用getopt_long()将返回字符'a',并且将字符串123由optarg返回(注意注意!字符串123由optarg带回!optarg不需要定义,在getopt.h中已经有定义),那么,如果命令行参数是-c,那么调用getopt_long()将返回字符'c',而此时,optarg是null。最后,当getopt_long()将命令行所有参数全部解析完成后,返回-1。

参数longopts,其实是一个结构的实例:

代码如下:

struct option {
const char *name; //name表示的是长参数名
int has_arg; //has_arg有3个值,no_argument(或者是0),表示该参数后面不跟参数值
// required_argument(或者是1),表示该参数后面一定要跟个参数值
// optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值
int *flag;
//用来决定,getopt_long()的返回值到底是什么。如果flag是null,则函数会返回与该项option匹配的val值
int val; //和flag联合决定返回值
}

给个例子:
代码如下:

struct option long_options[] = {
{"a123", required_argument, 0, 'a'},
{"c123", no_argument, 0, 'c'},
}

现在,如果命令行的参数是-a 123,那么调用getopt_long()将返回字符'a',并且将字符串123由optarg返回(注意注意!字符串123由optarg带回!optarg不需要定义,在getopt.h中已经有定义),那么,如果命令行参数是-c,那么调用getopt_long()将返回字符'c',而此时,optarg是null。最后,当getopt_long()将命令行所有参数全部解析完成后,返回-1。
范例
代码如下:

#include
#include
char *l_opt_arg;
char* const short_options = "nbl:";
struct option long_options[] = {
{ "name", 0, NULL, 'n' },
{ "bf_name", 0, NULL, 'b' },
{ "love", 1, NULL, 'l' },
{ 0, 0, 0, 0},
};
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;
printf("Our love is %s!/n", l_opt_arg);
break;
}
}
return 0;
}
[root@localhost wyp]# gcc -o getopt getopt.c
[root@localhost wyp]# ./getopt -n -b -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]#
[root@localhost liuxltest]# ./getopt -nb -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]# ./getopt -nbl forever
My name is XL.
His name is ST.
Our love is forever!

    
 
 

您可能感兴趣的文章:

  • php通过pack和unpack函数实现对二进制数据封装及解析
  • php trim函数执行过程解析
  • C++空类默认函数详细解析
  • PHP json_decode函数详细解析
  • shell自定义函数及参数调用解析
  • jquery toggle()函数实例解析
  • 内联函数inline与宏定义深入解析
  • C与C++ 无参函数的区别解析
  • C#委托所蕴含的函数指针概念详细解析
  • 解析c语言中"函数调用中缺少哨兵"的情况分析
  • 函数外初始化与函数内初始化详细解析
  • C#中私有构造函数的特点和用途实例解析
  • C语言static修饰函数详细解析
  • 深入解析函数指针与返回函数的指针
  • C++指向函数的指针实例解析
  • 解析在MYSQL语法中使用trim函数删除两侧字符
  • 解析C++中虚析构函数的作用
  • C语言typedef与复杂函数声明问题的深入解析
  • php取整函数实例解析
  • C++中函数的默认参数详细解析
  • php中sprintf与printf函数用法区别解析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 请教linux命令行的解析过程是怎样的
  • 如何解析gcc ar命令产生的静态库?
  • C++命令行参数解析器 CLPP
  • 命令行参数解析类库 args4j
  • linux iis7站长之家
  • 命令行参数解析工具包 CmdOption
  • 命令行参数解析库 JCommander
  • Java 命令行解析器 JOpt Simple
  • 命令行参数解析类库 Arg_parser
  • 听说cygwin可以在WINDOWS下,解析UNIX命令,可是我下载了却装不上?
  • 在做FTP服务端,请问哪位有解析LIST命令的C语言代码?
  • redhat linux bash错误,命令解析不了了,请大家帮我看看
  • 鸡毛!鸡毛!鸡毛! LINUX是怎么解析象ls,mkdir命令的......
  • 命令行参数解析包 SimpleOpt
  • linux命令解析,开发中遇到的一个启动脚本的语句
  • 解析Mysql备份与恢复简单总结与tee命令的使用介绍
  • C++编写FTP客户端解析LIST命令获取目录不完整,求解。
  • 解析如何在C语言中调用shell命令的实现方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 如何用libxml2 默认解析器解析HTML文件
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 服务器本机能解析域名,其它机子都解析不到,能ping通dns服务器地址,是什么问题?//
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 我有一个DNS服务器,既要解析自己局域网里IP,有要解析外网上的IP,如www.163.com,我该如何设置呢
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3