C/C++—— 分析命令行参数的getopt()函数使用介绍

getopt()与getopt_long()的使用简介 感性认识 getopt()与getopt_long()是专门处理命令行参数的两个函数,getopt()处理短参数,getopt_long()处理长参数。还不明白请看下面这张图: 解析 -t yiqi 就是这两个函数做的事,下面我们一起来看看究竟如何使用好这两个函数。还不明白的请看下图: 非常清楚,命令行参数由Command name,Option,Option argument以及Operands组成。 Command name不用多说,就是程序的名称。 操作对象Operands又称no. 阅读详情

函数介绍:

首先输入命令:man 3 getopt 查看getopt函数的man手册介绍

#include <unistd.h>

int getopt(int argc, char * const argv[], const char *optstring);

extern char *optarg;
extern int optind, opterr, optopt; 

函数说明 getopt()用来分析命令行参数。参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的。

下面用一个例子来输出main函数中的argc,argv[ ]内容:

#include <stdio.h>


int main(int argc, char* argv[])
{
    int i = 0;
    printf("共%d个命令行参数\n", argc);
    for(i = 0; i < argc; ++i){
        printf("第%d个参数是: %s\n", i+1, argv[i]);
    }

    return 0;
}
输出:

root@linux_ever:~/linux_ever/work_test# ./getopt
共1个命令行参数
第1个参数是: ./getopt
root@linux_ever:~/linux_ever/work_test# ./getopt -a -h help
共4个命令行参数
第1个参数是: ./getopt
第2个参数是: -a
第3个参数是: -h
第4个参数是: help

参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,
如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。
如果在处理期间遇到了不符合optstring指定的其他选项getopt()将显示一个错误消息,并将全域变量optarg设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。

getopt() 所设置的全局变量包括:
optarg---指向当前选项的参数的指针(选项字母:后的参数)。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。 optopt——最后一个未知选项。

返回值:

If  an  option  was  successfully  found, then getopt() returns the option character.  If all command-line options have been parsed, then getopt() returns -1.  If getopt() encounters an option character that was not in optstring, then '?' is returned.  If getopt() encounters an option with  a missing  argument,  then  the  return  value  depends  on  the  first character in optstring: if it is ':', then ':' is returned; otherwise '?' is returned.

大概意思就是:

如果一个选项成功被找到,则getopt返回该选项字符,比如a, b, c....
如果所有的选项都被找到,则getopt返回-1。
如果getopt函数遇到了一个在optstring参数中没有指定的选项,则返回'?'。
如果在-a之后忘了输出参数,则返回':'(此时optstring中有字符a:),如果不是a:,则返回'?'


optstring中的指定的内容的意义(例如getopt(argc, argv, "ab:c:de::");)
1.单个字符,表示选项,(如上例中的abcde各为一个选项)
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。(如上例中的b:c:)
3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。
该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL),但是在实例中测试却是::没什么作用。。


实例:

/*************************************************************************
	> File Name: getopt.c
	> Author: 
	> Mail: 
	> Created Time: 2016年03月31日 星期四 17时18分23秒
 ************************************************************************/

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


int main(int argc, char* argv[])
{
    printf("*****************************************\n");
    int i = 0;
    printf("共%d个命令行参数\n", argc);
    for(i = 0; i < argc; ++i){
        printf("第%d个参数是: %s\n", i+1, argv[i]);
    }
    printf("*****************************************\n");

    char ch;

    while((ch = getopt(argc, argv, "a:bc::h")) != -1){
        //printf("optind = %d, optopt = %d\n", optind, optopt);

        switch(ch){
            case 'a':
                printf("选项是%c, 选项内容: %s\n", ch, optarg);
                break;
            case 'b':
                printf("选项是%c, 选项内容: %s\n", ch, optarg);
                break;
            case 'c':
                printf("选项是%c, 选项内容: %s\n", ch, optarg);
                break;
            case 'h':
                printf("选项是%c\n", ch);
                printf("-a optstring\n");
                printf("-b\n");
                printf("-c optstring or NULL\n");
                printf("-h");
                break;
            default:
                printf("other option: %c\n", ch);
                break;
        }
    }
    return 0;
}

输出:

root@linux_ever:~/linux_ever/work_test# ./getopt -h
*****************************************
共2个命令行参数
第1个参数是: ./getopt
第2个参数是: -h
*****************************************
选项是h
-a optstring
-b
-c optstring or NULL
-hroot@linux_ever:~/linux_ever/work_test# ./getopt -a linux_ever
*****************************************
共3个命令行参数
第1个参数是: ./getopt
第2个参数是: -a
第3个参数是: linux_ever
*****************************************
选项是a, 选项内容: linux_ever
root@linux_ever:~/linux_ever/work_test# ./getopt -a linux_ever -b
*****************************************
共4个命令行参数
第1个参数是: ./getopt
第2个参数是: -a
第3个参数是: linux_ever
第4个参数是: -b
*****************************************
选项是a, 选项内容: linux_ever
选项是b, 选项内容: (null)
root@linux_ever:~/linux_ever/work_test# ./getopt -a linux_ever -b -c ever         
*****************************************
共6个命令行参数
第1个参数是: ./getopt
第2个参数是: -a
第3个参数是: linux_ever
第4个参数是: -b
第5个参数是: -c
第6个参数是: ever
*****************************************
选项是a, 选项内容: linux_ever
选项是b, 选项内容: (null)
选项是c, 选项内容: (null)


C/C++命令行参数解析:getopt函数族原理与实战指南 命令行参数解析是程序与用户交互的基础技术,其核心在于将用户输入的字符串序列转化为程序内部可处理的结构化数据。传统手动解析argv数组的方式不仅代码冗余,且难以处理短选项、长选项、带参选项等复杂组合,易引入错误。getopt函数族作为POSIX标准的一部分,通过定义选项字符串和结构体数组,实现了参数解析的标准化与自动化,显著提升代码健壮性和可维护性。在C/C++开发中,尤其在构建需要复杂配置的命令行工具(如涉及ncurses库的项目)时,掌握getopt及其增强版getopt_long至关重要。本文以工程实践 阅读详情

相关推荐

C++ 解决std::string字符串显示中文乱码的问题

在打印包含汉字的std::string时,出现中文显示乱码的问题,而将内容保存到notepad++ Utf-8格式的文本中却显示正常。解决方法见章节2.1。

weixin_43896283的博客 5693

getopt函数使用

函数原型 #include<getopt.h> getopt(int argc,char *argv,char *str); 这个函数的作用和main(argc,argv)相似来接收终端传递来的参数,不过这个函数比main函数有更大的优点,通常传递参数和值的时候使用这个比如 "-a 6 -t 7"这种类型的参数。 这个函数的第一个和第二个参数都是从main函数中得到的参数,第三个参数...

sun的博客 1597

getopt函数使用指南

文章目录1. C/C++ main函数原型1.1 命令行参数2. getopt函数2.1 命令、选项、选项参数及非选项参数2.1.1 选项参数2.1.2 可选的选项参数3. 环境变量POSIXLY_CORRECT4. getopt无处不在 1. C/C++ main函数原型      当我们编写一个C/C++项目或是小demo时候,总是需要一个main函数(主函数),该main函数是程序执行时的第一个函数,也是整个项目或demo的入口,通常情况下,我们看到的函数原型如下: int main(void) {

Postgres 数据库内核开发工程师 613

getopt 和 getopt_long 命令行解析函数

getopt 和 getopt_long 命令行解析函数

hinewcc的博客 4007

getopt.h 头文件

缺少getopt.h头文件的,将文件下载后,放在你创建的工程下,并包含进你的代码里可以了。很好用! 适合C与C++,编译出错的话,可以关闭编译器重新编译!

STM32异常与中断过程详解

1. 异常与中断概念引入 异常主要是指来自CPU内部的意外事件,比如执行了未定义指令、算术溢出、除零运算等发生在CPU内部的意外事件,这些异常的发生,会引起CPU运行相应的异常处理程序;中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而去执行异常/中断的处理函数。 下面对异常和中断的介绍,如果中断信号的产生原因来自CPU内部,则称之为异常;如果中断信号来

luobeihai的博客 1万+

C语言命令行处理

一、简介 getopt()函数是一个标准库调用,可允许您使用直接的 while/switch 语句方便地逐个处理命令行参数和检测选项(带或不带附加的参数)。与其类似的getopt_long()允许在几乎不进行额外工作的情况下处理更具描述性的长选项,这非常受开发人员的欢迎。   二、示例 1、getopt()函数原型 getopt(int argc,char *const argv[],const ...

weixin_33862041的博客 301

Spring Boot 微服务 API 网关实战:Spring Cloud Gateway 整合,搞定路由转发 + 统一认证 + 限流熔断(企业级落地)

摘要:本文详细介绍了SpringCloud Gateway在微服务架构中的核心作用与实现方案。作为API网关,它解决了服务入口分散、认证冗余、流量失控等痛点,提供路由转发、统一认证、限流熔断等能力。文章通过图书管理系统案例,演示了SpringBoot整合Gateway的全流程,包括基础路由配置、JWT全局认证、局部参数校验、Sentinel限流熔断以及Nacos动态路由等核心功能实现。特别强调了企业级落地中的关键注意事项,如路由顺序、过滤器执行顺序、HTTPS配置等。该方案能有效构建统一、安全、高效的微服务

lamehsl的专栏 1381

C/C++ 命令解析:getopt 方法详解和使用示例

一、简介 getopt() 方法是用来分析命令行参数的,该方法由 Unix 标准库提供,包含在 &lt;unistd.h&gt; 头文件中。   二、定义 int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, o...

阿飞的博客 5万+

开坑!双向逆变电源实操系列--第一节PFC

文章摘要 本文介绍了PFC(功率因数校正)的基本概念及其重要性。PFC电路通过储能和功率因数校正两大功能,解决交流电小电压大电流的问题,并减少无功电流损耗。文章对比分析了无源PFC(电感串联式、填谷式、LC谐振式)和有源PFC(升压型、交错并联、图腾柱式)的拓扑结构及适用场景。针对2400W双相逆变电源设计,作者选择图腾柱PFC拓扑,详细阐述了设计思路,包括电气参数计算、性能指标设定、技术重点及风险预判。文章还提供了主电路参数定制计算方法,如BOOST电感值的推导过程,为电源工程师提供实用参考。

lyzh971103的博客 2551

手把手教你用Python实现最简单的语义通信(Sem Comm)Demo

本文通过Python和PyTorch,手把手教你构建一个基于深度学习的语义通信(Semantic Communication)Demo。该Demo使用自编码器架构,从MNIST图像中提取低维语义特征进行传输与重建,实现了从“传输比特”到“传递含义”的跨越,并探讨了其效率优势与鲁棒性。

weixin_29080843的博客 247

C/C++ getopt()函数的介绍及使用

对于这个过程会调用三次getopt()函数,和第一个输入一样,是找到选项-b和他的参数"qing er",这时optind的值为3,也就意味着,下一次的getopt()要从argv[3]开始搜索,所以第二次调用getopt()函数,找到选项-c和他的参数1234(选项和参数是连在一起的),由于-c1234写在一起,所以他两占一起占用argv[3],所以下次搜索从argv[4]开始,而argv[4]为空,这样第三次调用getopt()函数就会返回-1,循环随之结束。这就要涉及到main函数的那两个参数了,

墨痕诉清风的博客 3257

避坑指南:Vue调用摄像头常见6大报错解决方案(navigator.mediaDevices全兼容方案)

本文深入剖析了在Vue应用中调用摄像头时常见的六大报错,如权限拒绝、设备未找到等,并提供了基于navigator.mediaDevices的全兼容解决方案。内容涵盖从HTTPS环境配置、浏览器兼容性处理到摄像头资源管理与高级错误处理,旨在帮助开发者构建稳定可靠的企业级摄像头应用。

Black的专栏 340

c/c++中getopt()函数的使用

getopt()函数简介 getopt()函数用于分析命令行参数。 头文件: #include<unistd.h> 定义原型: int getopt(int argc, char * const argv[ ],const char * optstring); argc 和argv参数通常直接从main的参数直接传递而来。 optstring是一个包含合法选项字符的字符串。 例如:...

AlwaySimple的博客 1576

MFC Tab Control控件完全指南:从基础使用到高级定制

本文详细介绍了MFC中TabControl控件的使用方法和高级技巧。主要内容包括:1) TabControl基础属性设置与绑定;2) 样式定制和外观自定义;3) 创建派生类实现扩展功能;4) 动态页面管理和子对话框控制;5) 高级功能如标签拖拽排序和右键菜单。通过完整代码示例,展示了从基本应用到复杂场景的实现方案,包括多标签页管理、自定义绘制、动态添加/删除标签等核心功能,为MFC开发者提供了全面的TabControl开发指南。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 259

搞懂 ABAP 里的 Language Settings:登录语言、文本环境语言与 sy-langu 的真实含义

SAP系统中语言设置并非单一字段决定,而是由登录语言(logon language)和文本环境语言(text environment language)共同控制。登录语言在会话期间固定,而文本环境语言可通过SET LOCALE语句修改,影响文本处理、排序、异常显示等行为。开发中需区分两者:使用CL_ABAP_SYST方法获取登录语言,通过sy-langu或GET LOCALE获取当前文本环境语言。语言环境切换应谨慎处理并尽快恢复,避免影响会话中其他程序。在多语言场景下,正确处理语言设置对确保文本相关功能正常

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1307

C/C++编程:命令行参数

每个 C 语言程序都必须有一个称为 main()的函数,作为程序启动的起点。当执行程序时, 命令行参数(command-line argument)(由 shell 逐一解析)通过两个入参提供给 main()函数。 int main(int argc, char *argv[]); 第一个参数 int argc,表示命令行参数的个数。 第二个参数 char *argv[],是一个指向命令行参数的指针数组: 每一参数又都是以空字符(null)结尾的字符串。 首个字符串 argv[0],标识程序名本身 a

OceanStar的博客 7632

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C/C++ Main获取命令行参数

在用 C/C++ 写一些工具时,需要通过命令行传一些参数,这样就可以在命令行终端使用该工具或在脚本中使用该工具,从而实现批量处理。 比如近期需要实现一个对文件进行加解密的工具,我需要通过命令行传递如下参数: 需要处理的输入文件; 处理类型:加密还是解密; 处理多少长度; 输出文件; 1、函数说明 本文采用的短参数,函数定义如下: #include <unistd.h> //系统头...

AlanWang4523 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux C/C++ 处理命令行参数

到目前为止,大部分人编写的所有程序都可以用一个命令运行。举个例子,如果我们编译了一个称之为myprog./myprog但是,如果你想从命令行向正在运行的程序传递信息,该怎么办?考虑一个更复杂的程序,比如 GCC。要编译myprog字符串-o,myprog和myprog.c都是 gcc 的命令行参数。(从技术上讲,gcc也是一个参数,我们稍后会看到)命令行参数非常有用。毕竟,如果不能向 C 函数传递参数,C 函数就不会很有用了——添加向程序传递参数的功能会使它们更有用。

bluebird_shao的专栏 4374

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C/C++中 getopt() 函数

getopt()用来分析命令行参数。参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的 argc: argument count argv: argument vector //头文件 #include <unistd.h> extern char *optarg; //选项的参数指针 extern int optind, //再调用get...

weixin_44280688的博客 416

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

当一个用C语言编写的Linux或UNIX程序运行时,它是从main函数开始的。对这些程序而言,main函数的声明如下所示:int main(int argc, char *argv[])其中argc是程序参数的个数(int),argv是一个代表参数自身的字符串数组(char **)。无论操作系统何时启动一个新程序,参数argc和argv都被设置并传递给main。这些参数通常由另一个程序提供,这个程序

Flass Blog 2639

c/c++——getopt()函数的用法

该函数位于头文件<unistd.h>中,函数的原型为int getopt(int argc,char * argv[],const char* optstring); 看到该函数的前两个参数,我们可以立刻联想到main()函数,虽然有时候main()函数的前两个参数会省略,但如果我们需要通过命令行传参的话,就得用上它两了; 在正式介绍getopt()函数之前,我们还得说下与它有关...

weixin_41558411的博客 721

Windows下使用GetOpt函数使用

GetOpt库下载 GetOpt.h是一个GNU标准库的头文件,它包含一些从命令行上提取参数的工具用于基于文本C/C++应用程序。因为getopt.h不是ANSI C标准库的一部分,getopt必须编译到每个使用它的项目中,或者编译它倒一个静态类,显式的链接到程序中。在Windows下有一个预编译的getopt版本可用使用,其下载网址为: http://ieng6.ucsd.edu/~cs12...

系统运维 1110

C/C++:getopt() getopt_long() getopt_long_only

命令行选项解析函数(C语言):getopt()和getopt_long() 正规点的大型程序一般第一步就是处理命令行参数的,接着才是主干程序 while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1) getopt_long 只是getopt的增强版,功能多点 getopt getopt函数用来解析...

Lynn_0909的博客 794

想在Windows上使用getopt,我教你原地起飞

函数说明 getopt() 可以用来分析命令行参数。 int getopt(int argc,char * const argv[ ],const char * optstring); 参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的。参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。 这么好用的函数只能在 Li

baidu_36639782的博客 5102
上一篇: 数据结构与算法——RB树简介
下一篇: C/C++—— C++中一个空对象为什么还要占用一个字节空间
readyao
博客等级 码龄11年 243粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值