getopt()函数详细解释!保证看明白

2024-01-13 23:52

本文主要是介绍getopt()函数详细解释!保证看明白,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

研究select模型的时候看到CSDN很多博主用到了getopt函数,这个模型弄的一脸懵,getopt先弄明白。。

getopt() 方法是用来分析命令行参数的,它的作用是判断你输入的命令行是否正确。

1.命令行组成

我们举例说明命令行组成

ls -l  -a   /etc

这行命令的意思是:详细列出/etc这个文件夹下所有文件,包括隐藏文件的信息

ls   命令 (command)

a  和l 都是   选项 (option) ,选项前面,必须有短横线这才叫选项 

/etc 这叫 operand ,操作对象

grep -i water aaa.log

 这行命令的意思是:在aaa.log文件中,查找water字符串,不区分大小写

grep  命令

i  选项

water ,正则表达式中叫匹配模式pattern ,命令行中叫做 选项参数 ( option argument)

aaa.log  操作对象 

比方说我瞎写 了一个aaa.log 其中内容是

water
water222
333water
444aaabbcc
555line
footabl
footballwater lunch
aaawatersuper

那么上书命令的 执行结果是

water
water222
333water
footballwater lunch
aaawatersuper
 

然后很多命令有不止一个参数,继续拿grep举例

grep -f aaa.log water aaa.log

 这个命令意思是:在结果中每一行都打印一遍aaa.log 这个文件名,在文件aaa.log中查找water字符串,不区分大小写。然后执行结果是

aaa.log:water
aaa.log:water222
aaa.log:333water
aaa.log:444aaabbcc
aaa.log:555line
aaa.log:footabl
aaa.log:footballwater lunch
aaa.log:aaawatersuper

我晕死,我也不知道-f怎么不匹配的现在也在结果中变红了匹配了,但是这先不重要,弄明白命令行的组成就行了

2. getopt函数

2.1 函数原型

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

2.2  参数argc  argv是什么意思

 argc是你在命令行中的所有参数个数,argv[]是所有参数组成的数组,外加可执行文件名

#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main(int argc, char* argv[]){printf("参数个数是%d\n",argc);for(int i=0;i<argc;i++){printf("参数argv[%d] 是%s\n",i,argv[i]);}return 0;
}

把这个代码gcc 编译成a.out 

然后你 ./a.out   hello world cat dog 回车,结果显示

参数个数是5

argv[0] 是 ./a.out

argv[1] 是 hello

argv[2] 是 world

argv[3] 是 cat

argv[4] 是 dog

2.3 。 这个函数有几个全局变量

getopt()函数有几个系统默认的全局变量,可以直接拿出来使用

  • optarg:当前选项的参数字符串 ,要么是null 要么是你写的,或者系统捕获的选项参数。
  • optind:下一个查找的位置,在所有命令行中的索引。
  • optopt:当发现无效选项字符时,optopt 就等于这个无效选项字符
  • opterr:1或者0 ,正常状态是1,表示打印错误
//学习get_opt()
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main(int argc, char* argv[]){printf("参数个数是%d\n",argc);for(int i=0;i<argc;i++){printf("参数argv[%d] 是%s\n",i,argv[i]);}printf("test getopt func\n");int ret;while ((ret=getopt(argc, argv,"abc:")) !=-1){printf("返回值ret =%d ,int optind= %d,它的选项参数optarg =%s, 错误选项optopt =%c\n",ret,optind,optarg,optopt);}
return 0;
}

 我的初衷是,只有-a  -b -c 是合法选项,  -c 后面必须接参数,  abc 可以不全,但是 c后面必须有参数 。下面来实验下我瞎写的参数 或者故意写错会报什么

2.3.1 完全正确的输入

我输入    ./test2 -a -b -c wang
参数个数是5
参数argv[0] 是./test2
参数argv[1] 是-a
参数argv[2] 是-b
参数argv[3] 是-c
参数argv[4] 是wang
test getopt func
返回值ret =97 ,int optind= 2,它的选项参数optarg =(null), 错误选项optopt =
返回值ret =98 ,int optind= 3,它的选项参数optarg =(null), 错误选项optopt =
返回值ret =99 ,int optind= 5,它的选项参数optarg =wang, 错误选项optopt =

都对,所以到最后也没抓到哪个参数错误 (optopt一直是空的)

 2.3.2  有一个不该出现的参数

./test2 -a -b -d wang
参数个数是5
参数argv[0] 是./test2
参数argv[1] 是-a
参数argv[2] 是-b
参数argv[3] 是-d
参数argv[4] 是wang
test getopt func
返回值ret =97 ,int optind= 2,它的选项参数optarg =(null), 错误选项optopt =
返回值ret =98 ,int optind= 3,它的选项参数optarg =(null), 错误选项optopt =
./test2: invalid option -- 'd'
返回值ret =63 ,int optind= 4,它的选项参数optarg =(null), 错误选项optopt =d

2.3.3 打乱参数顺序

./test2 -b -c -d wang
参数个数是5
参数argv[0] 是./test2
参数argv[1] 是-b
参数argv[2] 是-c
参数argv[3] 是-d
参数argv[4] 是wang
test getopt func
返回值ret =98 ,int optind= 2,它的选项参数optarg =(null), 错误选项optopt =
返回值ret =99 ,int optind= 4,它的选项参数optarg =-d, 错误选项optopt =

没抓到错误,因为 选项c 后面的-d被认为是选项参数了,后面的wang酒忽略不看了。

未完待续额,后面写getopt _long
 


 

这篇关于getopt()函数详细解释!保证看明白的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子