简单命令行处理函数:getopt() ---转

2024-04-06 09:32

本文主要是介绍简单命令行处理函数:getopt() ---转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

函数getopt()用来分析命令行参数(可怜的Sam啊……以前还傻愣愣的自己写命令行参数解析函数…I’m too simple…sometimes naive.),其函数原型和相关变量声明如下:

        #include <unistd.h>
        extern char *optarg;
        extern int optind,  // 初始化值为1,下一次调用getopt时,从optind存储的位置重新开始检查选项。
        extern int opterr,  // 初始化值为1,当opterr=0时,getopt不向stderr输出错误信息。
        extern int optopt;  // 当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,
                                    // 该选项存储在optopt中, getopt返回'?’。
        int getopt(int argc, char * const argv[], const char *optstring);        optarg和optind是两个最重要的external 变量。optarg是指向参数的指针(当然这只针对有参数的选项);optind是argv[]数组的索引,众所周知,argv[0]是函数名称,所有参数从argv[1]开始,所以optind被初始化设置指为1。        每调用一次getopt()函数,返回一个选项,如果该选项有参数,则optarg指向该参数。 在命令行选项参数再也检查不到optstring中包含的选项时,返回-1。

        函数getopt()有三个参数,argc和argv[]应该不需要多说,下面说一下字符串optstring,它是作为选项的字符串的列表。
        函数getopt()认为optstring中,以'-’开头的字符(注意!不是字符串!!)就是命令行参数选项,有的参数选项后面可以跟参数值。optstring中的格式规范如下:
1) 单个字符,表示选项,
2) 单个字符后接一个冒号”:”,表示该选项后必须跟一个参数值。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3) 单个字符后跟两个冒号”::”,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
        例如optstring="ab:c::d::",程序名称为test.ext,在命令行下运行该程序:


        test.exe -a -b host -ckeke -d haha
        在这个命令行参数中,-a和-h就是选项元素,去掉'-',a,b,c就是选项。host是b的参数,keke是c的参数。但haha并不是d的参数,因为它们中间有空格隔开。所以上面的命令行调用会出错。
        默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后。例如:


        test.exe -a ima -b host -ckeke -d haha        最后命令行参数的顺序是: -a -b host -ckeke -d ima haha
        如果optstring中的字符串以'+'加号开头或者环境变量POSIXLY_CORRE被设置。那么一遇到不包含选项的命令行参数,getopt就会停止,返回-1。
    对getopt()函数的使用,通常用一个循环,不断的调用它,获得其参数选项以及参数值(如果有的话),直到取完最后一个命令行参数(getopt()函数返回值为-1)。并且,为了防止用户不按照要求进行命令行输入,会设计一个help选项,以告知用户如何使用命令行运行该程序)。

  
范例  #include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,”a:bcde”))!= -1)
switch(ch)
{
case ‘a’:
printf(“option a:’%s’/n”,optarg);
break;
case ‘b’:
printf(“option b :b/n”);
break;
default:
printf(“other option :%c/n”,ch);
}
printf(“optopt +%c/n”,optopt);
}
 
执行  $./getopt –b
option b:b
$./getopt –c
other option:c
$./getopt –a
other option :?
$./getopt –a12345
option a:’12345’

#include<string.h>
#include<stdio.h>
#include<unistd.h>
static int opt_a=0;
static int opt_b=0;
static int opt_c=0;
static int opt_d=0;
static int opt_e=0;
static char * opt_a_arg=NULL;
static void usage()
{
        fprintf(stderr,"Usage:getopt [a arg] [b] [c] [d] [e]/n");
        exit(1);
}

int main(int argc,char **argv)
{
         int opt;
         char opts[]="a:bcde";
         opterr = 0;
         while((opt = getopt(argc,argv,opts)) != -1){
                 switch(opt)
                 {
                         case 'a':
                                 opt_a=1;
                                 opt_a_arg=strdup(optarg);
                                 break;
                         case 'b':
                                 opt_b=1;
                                 break;
                         case 'c':
                                 opt_c=1;
                                 break;
                         case 'd':
                                 opt_d=1;
                                 break;
                         case 'e':
                                 opt_e=1;
                                 break;
                         case '?':
                                 usage();
                                 break;
                 }
         }
if(opt_a || opt_b || opt_c|| opt_d || opt_e)
         {
                 if(opt_a)
                         printf("opt a is set and arg is %s /n",opt_a_arg);
                 if(opt_b)
                         printf("opt b is set/n");
                 if(opt_c)
                         printf("opt c is set /n");
                 if(opt_d)
                         printf("opt d is set /n");
                 if(opt_e)
                         printf("opt e is set /n");
         }else
                 usage();
}

/* Glib C 的getopt源代码文件中 自带的测试的代码 */

#ifdef TEST
/* Compile with -DTEST to make an executable for use in testing
    the above definition of `getopt'.   */
int
main (int argc, char **argv)
{
   int c;
   int digit_optind = 0;
while (1)
     {
       int this_option_optind = optind ? optind : 1;
c = getopt (argc, argv, "abc:d:0123456789");
       if (c == -1)
         break;
switch (c)
         {
         case '0':
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
           if (digit_optind != 0 && digit_optind != this_option_optind)
             printf ("digits occur in two different argv-elements./n");
           digit_optind = this_option_optind;
           printf ("option %c/n", c);
           break;
case 'a':
           printf ("option a/n");
           break;
case 'b':
           printf ("option b/n");
           break;
case 'c':
           printf ("option c with value `%s'/n", optarg);
           break;
case '?':
           break;
default:
           printf ("?? getopt returned character code 0%o ??/n", c);
         }
     }
if (optind < argc)
     {
       printf ("non-option ARGV-elements: ");
       while (optind < argc)
         printf ("%s ", argv[optind++]);
       printf ("/n");
     }
exit (0);
}
#endif /* TEST */
参考
:   http://blog.chinaunix.net/u/12457/showart_345700.html

文章出处:http://www.diybl.com/course/3_program/c++/cppjs/2007930/75180.html

这篇关于简单命令行处理函数:getopt() ---转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879590

相关文章

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder