【getopt函数用法】

2024-05-12 21:20
文章标签 函数 用法 getopt

本文主要是介绍【getopt函数用法】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写目录标题

  • 一、概述
  • 二、选项字符串规则:
  • 三、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 pramaterswitch(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后为可选参数但却有空格
在这里插入图片描述
可见,可选参数与选项之间必须不能带空格

这篇关于【getopt函数用法】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

pandas使用apply函数给表格同时添加多列

《pandas使用apply函数给表格同时添加多列》本文介绍了利用Pandas的apply函数在DataFrame中同时添加多列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、Pandas使用apply函数给表格同时添加多列二、应用示例一、Pandas使用apply函

Java序列化之serialVersionUID的用法解读

《Java序列化之serialVersionUID的用法解读》Java序列化之serialVersionUID:本文介绍了Java对象的序列化和反序列化过程,强调了serialVersionUID的作... 目录JavChina编程a序列化之serialVersionUID什么是序列化为什么要序列化serialV

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

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

Python中Namespace()函数详解

《Python中Namespace()函数详解》Namespace是argparse模块提供的一个类,用于创建命名空间对象,它允许通过点操作符访问数据,比字典更易读,在深度学习项目中常用于加载配置、命... 目录1. 为什么使用 Namespace?2. Namespace 的本质是什么?3. Namesp

MySQL中如何求平均值常见实例(AVG函数详解)

《MySQL中如何求平均值常见实例(AVG函数详解)》MySQLavg()是一个聚合函数,用于返回各种记录中表达式的平均值,:本文主要介绍MySQL中用AVG函数如何求平均值的相关资料,文中通过代... 目录前言一、基本语法二、示例讲解1. 计算全表平均分2. 计算某门课程的平均分(例如:Math)三、结合