【getopt函数用法】

news2024/11/30 6:32:24

这里写目录标题

  • 一、概述
  • 二、选项字符串规则:
  • 三、getopt 返回值
  • 四、会用到的全局变量:
  • 三、示例代码
  • 四、上机实验

一、概述

int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg; //这个最常用,保存一个选项的参数
extern int optind, opterr, optopt;

用法:getopt每次调用会返回main的输入中带“-”的参数。参数argc和argv是由main()传递的参数个数和内容,最后一个参数为选项字符串。这个字符串规定了选项中字符串的内容是否要带参数。

二、选项字符串规则:

1、 字符代表一个选项
2、 没有冒号表述纯选项,这样的参数可以连写
3、 字符后面有冒号代表选项要有参数(字符和参数可以隔开一个空格,也可不隔开)
4、 两个冒号代表选项之后的参数可写可不写,且参数与值之间必须不能有空格。
5、 参数使用时部分先后顺序
6、 默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后。

违反规则后的后果:
如果本身字符后无冒号但使用时却带上参数:
1、 不加空格带上参数:都解析为选项了。
2、 加上空格带上参数:只解析出选项,忽略参数。
如果本身字符后一个冒号但使用时却没参数或带好多参数:
1、 多加参数,只解析第一个,其余的忽略
2、 不加参数,解析失败
参数为可选参数却有空格,则解析错误。???

比如,"vha:b:c::"就表示:

支持-v选项,通常用于打印版本号;
支持-h选项,通常用于打印帮助信息;
支持-a选项,后面必须带有一个参数;
支持-b选项,后面必须带有一个参数;
支持-c选项,后面可以带参数,也可以不用带参数;

三、getopt 返回值

正常调用时,会返回对应的合法参数字符. 当遇到不合法的参数字符时(不包含在optstring 中),会返回’?’ . 当所有的命令行条目被解析完成后,getopt 返回-1

四、会用到的全局变量:

optarg:用来保存选项的参数(最长用)
optind:用来记录下一个检索位置;????
opterr:用来表示是否将错误信息输出到stderr,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
optopt:表示不在选项字符串optstring中的选项;????

三、示例代码

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

int main(int argc, char *argv[])
{
        int opt;
        printf("begin: optind: %d, opterr: %d \n", optind, opterr);
        while((opt = getopt(argc, argv, "vha:b:c::")) != -1) {
                printf("begin to prase pramater: %d \n ", optind); //optind record the position of next pramater
                switch(opt) {
                        case 'v':
                                printf("version: v1.1 \n");
                                break;
                        case 'h':
                                printf("Usage: ./getopt_test -a 1 -b 2 -c [hello] \n");
                                break;
                        case 'a':
                                printf("pramater of -a: %s \n", optarg);
                                break;
                        case 'b':
                                printf("pramater of -b: %s \n", optarg);
                                break;
                        case 'c':
                                printf("pramater of -c: %s \n", optarg);
                                break;
                        case '?':
                                printf("pramater illegal : %s \n", optarg);
                                break;
                        default:
                                break;
                }
        }
}

四、上机实验

4.1 正常情况
在这里插入图片描述
在这里插入图片描述

其中,opterr为1,表示会主动打印出错信息。
4.2 选项字符串v后无冒号却带参数(之间有空格)
在这里插入图片描述
可见,直接将参数抛弃了。

4.3 选项字符串v后无冒号却带参数(之间无空格)
在这里插入图片描述
可见他以为我输入的都是不带参数的选项。

4.4 选项字符串a后必须有参数却不加参数
在这里插入图片描述
可见他没找到参数,立马报错了。
4.4 选项字符串a后有冒号却有两个参数
在这里插入图片描述
可见多余的参数直接被忽略了

4.5 选项字符串c后为可选参数但却有空格
在这里插入图片描述
可见,可选参数与选项之间必须不能带空格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1667847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eNSP-BGP综合实验

目录 实验要求 子网划分 配置IP地址 AS2内使用ospf协议配置全网通 配置 查看建邻情况 配置BGP协议 配置 测试 配置BGP反射器 宣告网段达成全网通 宣告 测试 构建VPN隧道 配置 测试 实验要求 1、AS 1中存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xf…

MF自定义控件方法

在MFC中&#xff0c;您可以通过自定义控件来实现特定的用户界面元素或功能&#xff0c;以满足您的应用程序需求。自定义控件通常是从CWnd类派生的子类&#xff0c;您可以在其中重写绘制、处理事件等方法&#xff0c;以实现您想要的功能和外观。以下是一般步骤&#xff1a; 创建…

【荣耀笔试题汇总】2024-05-11-荣耀春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新小米近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f49…

repo跟git的关系

关于repo 大都讲的太复杂了,大多是从定义角度跟命令角度去讲解,其实从现实项目使用角度而言repo很好理解. 我们都知道git是用来管理项目的,多人开发过程中git功能很好用.现在我们知道一个项目会用一个git仓库去管理,项目的开发过程中会使用git创建分支之类的来更好的维护项目代…

正方形中的最多点数

代码实现&#xff1a; 方法一&#xff1a;遍历——超时 int maxPointsInsideSquare(int **points, int pointsSize, int *pointsColSize, char *s) {int a 0;int flag 1;int num, pre_num 0;while (flag) {num pre_num;pre_num 0;int hash[26] {0};for (int i 0; i <…

fastjson2使用

说明&#xff1a;fastjson2是一个性能极致并且简单易用的Java JSON库&#xff08;官方语&#xff09;&#xff0c;本文介绍在Spring Boot项目中如何使用fastjson2。 创建项目 首先&#xff0c;创建一个Maven项目&#xff0c;引入fastjson2依赖&#xff0c;如下&#xff1a; …

Windows使用cowaxess(goaccess)分析Nginx日志

原文网址&#xff1a;Windows使用cowaxess(goaccess)分析Nginx日志_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Windows安装cowaxess来分析Nginx的access.log日志的方法。 cowaxess是goaccess的Windows版本&#xff0c;cowaxess底层会调用goaccess。 GoAccess 是一个专门用来…

使用迭代器进行遍历时不能进行元素的任何修改

记录一下 使用迭代器进行遍历时不能进行元素的任何修改 ArrayList<String> list new ArrayList<>();list.add("一");list.add("二");list.add("光");list.add("华"); // 遍历器Iterator<String> iterator …

如何使用活字格批量导入照片到数据表

活字格是一款功能强大的电子表格软件&#xff0c;除了基本的表格计算功能之外&#xff0c;还提供了丰富的扩展功能&#xff0c;可以用来实现各种自动化操作。例如&#xff0c;我们可以使用活字格来批量导入照片到数据表中。 以下是具体的操作步骤&#xff1a; 在活字格工作表…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址&#xff1a;GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架&#xff0c;重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址&#xff1a;GitHub - tokio-rs/axum: …

C++入门系列-拷贝构造函数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 拷贝构造函数 概念 在创建对象的时候&#xff0c;能不能创建一个和已知已存在的对象一模一样的对象呢&#xff1f; 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参…

飞书API(8):MySQL 入库定制版本

一、引入 通用版能解决百分之八九十的任务&#xff0c;剩下的部分任务需要进行定制。 先说明通用版本和定制版本有什么不同&#xff0c;通用版本就是只管大的数据类型&#xff0c;将数据处理为对应的类型入库&#xff0c;而定制版本会考虑局部列的数据类型&#xff0c;。举个…

Linux i2c工具——i2c_tools

1 简介 i2c-tools是一个用于处理I2C&#xff08;Inter-Integrated Circuit&#xff09;总线的工具集&#xff0c;它在Linux环境中广泛使用。这个工具集包含了一系列命令行工具&#xff0c;用于在I2C总线上执行各种操作&#xff0c;例如扫描设备、读取/写入寄存器、检测设备等。…

Copilot for Microsoft 365 扩充新增 16 种语言

最近&#xff0c;微软公司发布公告&#xff0c;进一步扩大 Copilot for Microsoft 365 语言支持&#xff0c;新增 16 种&#xff0c;支持的语言总数达到 25 种。 新支持的语言如下&#xff1a; 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附赠ui配置、第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适的操作系统平台后点击dowload按钮…

车规级低功耗汽车用晶振SG-9101CGA

车规级晶振SG-9101CGA属于爱普生9101系列&#xff0c;是一款可编程晶振。SG-9101CGA车规级晶振采用2.5x2.0mm封装&#xff0c;利用PLL技术生产&#xff0c;此款振荡器的频率范围从0.67M~170MHZ任一频点可选&#xff0c;步进1ppm&#xff0c;采用标准CMOS输出&#xff0c;最大输…

你知道C++多少——默认成员函数

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

临时邮箱API发送邮件的安全性?如何保障?

临时邮箱API发送邮件的步骤有哪些&#xff1f;设置邮箱API方法&#xff1f; 电子邮件作为一种重要的通信方式&#xff0c;而临时邮箱API作为一种新兴的邮件发送技术&#xff0c;其安全性更是成为大家关注的焦点。那么&#xff0c;临时邮箱API发送邮件的安全性究竟如何呢&#…

本地vite启动的vue项目使用nginx代理

前提&#xff1a; 必须在同一网段或者相同的局域网&#xff01;&#xff01;&#xff01; nginx下载通道&#xff1a; https://nginx.org/en/download.html 步骤&#xff1a; 1、最好下载稳定版本&#xff1a; 2、下载后直接解压&#xff08;注意&#xff1a;解压后不要放…

【代码随想录37期】 第一周总结

周末再写一遍 【代码随想录37期】Day01 二分查找 移除元素 【代码随想录37期】Day02 有序数组的平方、长度最小的子数组、螺旋矩阵Ⅱ 【代码随想录37期】Day03 移除链表元素、设计链表、反转链表 【代码随想录37期】Day04 两两交换链表中的节点、删除链表的倒数第N个节点、链…