getopt函数[通俗易懂]

getopt函数[通俗易懂]getopt函数函数说明getopt–解析命令的可选项getopt只是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,格式如下:对短选项的解析:cmd[-a][-b]对短选项及短选项的参数解析:cmd[-aa_argument][-bb_argument]选项a的参数也是可选的情况解析:cmd[-a[a_argument]]函数原型#include&…

大家好,又见面了,我是你们的朋友全栈君。

getopt函数

函数说明

getopt -- 解析命令的可选项
getopt只是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,格式如下:
对短选项的解析:cmd [-a][-b]
对短选项及短选项的参数解析:cmd [-a a_argument][-b b_argument]
选项a的参数也是可选的情况解析:cmd [-a[a_argument]]

函数原型

#include <unistd.h>
extern char *optarg;
extern int optind, opterr, optopt;
int getopt(int argc, char * const argv[], const char *optstring);

描述:

  • getopt函数解析命令行参数,argc、argv是调用main函数时传入的参数。传入的’-‘开始的字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv中的全部option解析出来;
  • 在getopt的执行中,每次进入都会更新optind变量,该变量指向下一个argv参数;
  • 如getopt返回-1,表示argv[]中的所有选项被解析出,optind指向第一个非选项的argument元素;这里要注意,在getopt执行过程中会将单独的argument交换到argv数组的后面,option选项提前,如:cmd -a file1 -b file2,如果a/b均为不带参数的选项,这最终argv数组变为:cmd -a -b file1 file2;
  • optstring指定选项合法的选项,一个字符代表一个选项,在字符后面加一个’:‘表示该选项带一个参数,字符后带两个’:’表示该选项带可选参数(参数可有可无),若有参数,optarg指向该该参数,否则optarg为0;
  • 前面说了getopt会进行argv顺序的调整,但也可以通过设置optstring改变它的方式,这里有两种:
    • 如果optstring的第一个参数是’+’或者POSIXLY_CORRECT被设置,则getopt在原argv的顺序上遇到第一个非选项就返回-1;
    • 如果optstring的第一个参数是’-’,则会将所有的非选项当选项处理,并且返回1,用字符代码1表示该选项;
  • 如果getopt不能识别一个选项字符,它会打印一个错误消息到stderr上,并将该字符存放到optopt中,返回’?’;调用程序可以设置opterr=0设置不打印错误信息;注意:要使能打印错误信息,optstring的第一个字符(或者在第一个字符是+/-之后)不能是’:’,否则也不会打印错误;
  • 如果optstring中指定了option需要参数,但在命令行没有参数,那么getopt将返回’?’,如果在optstring的第一个字符(或者在第一个字符是+/-之后)是’:’,那么将返回’:’;

返回值

  • 返回类型为int,这个在编程的时候要注意,因为返回值类型范围要包含-1,很容易返回值接收定义为char,但在一些系统中char是无符号的,将导致程序错误;
  • 当传入的argv中的选项全部被解析,getopt()返回-1,这也是getopt进行选项解析的循环截至条件;
  • 如果argv中解析出optstring中描述的选项字符,则返回该字符,如果该选项指定了参数,则全局变量optarg指向该参数;
  • 如果getopt遇到一个非optstring指定的选项字符,这表示该选项是未识别的,返回’?’,并且将该选项存放到全局变量optopt中;
  • 如果optstring指定了选项必须带参数,但传入的相应option丢失了参数,返回值依赖于optstring的第一个字符,若第一个字符是’:’,返回’:’,否则返回’?’;由于非法的选项返回也是’?’,所以常常optstring的第一个字符指定为’:’;同时将该选项存放到全局变量 optopt中;

测试例程

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{ 
   
    int i;
    int ret;

    for (i = 0; i < argc; i++)
        printf("argv[%d] %s\n", i, argv[i]);
    printf("\n");

    while ((ret = getopt(argc, argv, ":a:b::c")) != -1) { 
   
        switch (ret) { 
   
        case 'a':
            printf("option: %c argv: %s\n", ret, optarg);
            break;
        case 'b':
            if (optarg)
                printf("option: %c argv: %s\n", ret, optarg);
            else
                printf("option: %c no argument\n", ret);
            break;
        case 'c':
            printf("option: %c, no argument\n", ret);
            break;
        case '?':
            printf("encountered a unrecognized option: %c, argv: %s\n", optopt, argv[optind - 1]);
            break;
        case ':':
            printf("option: %c missing argument\n", optopt);
            break;
        default:
            printf("option: %c\n", ret);
            break;
        }
    }

    printf("\noptind: %d\n\n", optind);
    for (i = optind; i > 0 && i < argc; i++)
        printf("argv[%d] %s\n", i, argv[i]);
    printf("\n");
    for (i = 0; i < argc; i++)
        printf("argv[%d] %s\n", i, argv[i]);

    return 0;
}

总结

  • 对于必带参数的选项, 参数可以紧跟也可以加空格
  • 对于可选参数的选项, 参数必须紧跟,不紧跟会认为没有携带参数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131836.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java面向对象的思想(J2SE入门4)

    java面向对象的思想(J2SE入门4)

    2021年8月11日
    85
  • 重磅官宣:Nacos2.0性能提升10倍[通俗易懂]

    重磅官宣:Nacos2.0性能提升10倍[通俗易懂]简介:​Nacos2.0作为一个跨代版本,彻底解决了Nacos1.X的性能问题,将性能提升了10倍。作者:席翁继Nacos1.0发布以来,Nacos迅速被成千上万家企业采用,并构建起强大的生态。但是随着用户深入使用,逐渐暴露一些性能问题,因此我们启动了Nacos2.0的隔代产品设计,时隔半年我们终于将其全部实现,实测性能提升10倍,相信能满足所有用户的性能需求。下面由我代表社区为大家介绍一下这款跨代产品。Nacos简介Nacos是一个更易于构建云原生应用的动态服务发现、配置管理

    2022年9月20日
    0
  • 男人的恋爱过程「建议收藏」

    男人的恋爱过程「建议收藏」当对选择恋人的过程越谨慎,就越容易找到适合的恋人。虽然有的人很快就达到目的,但是基本上这是一个不断尝试与错误的过程。透过自我调整,最后终将达成目的。对常规四个阶段变化的了解,你可以了解你距离目标还有多远。让我们仔细探索男人、在四个阶段中的不同反应。男人:生理上的吸引在第一阶段男人对女人先产生生理上的吸引是很正常的。男人尤其注意女人的外表,她走路的方式、她的头发、微笑、眼睛、身高、美腿、…

    2022年7月25日
    9
  • windows搭建php环境_如何安装php环境

    windows搭建php环境_如何安装php环境使用apache+php+mysql的方式一、安装mysql1、下载mysql,下载地址:https://dev.mysql.com/downloads/installer/2、下载完成后解压我解压的路径是:D:\ProgramFiles\mysql-8.0.253、配置文件首先在解压的路径下查看是否含有my.ini的文件,如果没有则新建一个,内容如下:[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=D:\ProgramFiles\

    2022年9月15日
    0
  • 测试用例编写流程_测试用例的状态有几种

    测试用例编写流程_测试用例的状态有几种测试用例分层每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。从上图分析,我们可以看到testsuite中包含了3个测试用例,testca

    2022年8月6日
    4
  • J2EE究竟是什么?「建议收藏」

    J2EE究竟是什么?「建议收藏」J2EE(即Java2平台企业版)是由Sun公司主持推出的一项中间件技术。从CORBA、IDL到面向消息的系统,中间件技术已经走过了很长的一段路程,如今J2EE作为中间件技术史上的一块具有决定意义的里程碑,正受到业界越来越广泛的重视和采纳。J2EE,一方面有着一套相当庞大的标准体系和数个不同版本,另一方面,由于市场上应用服务器品种多样,各家开发商使用的术语又不尽相同,因此,围绕着J2EE,常

    2025年6月6日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号