Linux编程里getopt_long_only函数用法详解
在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子。下面介绍使用getopt_long_only和getopt_long( 两者用法差不多 )解析命令行选项。
程序中主要使用:
短选项 | 长选项 | 是否需要参数 | |
-n | --username | 是(用户名) | 指定用户名 |
-d | --debug | 否 | 是否已测试 |
1、函数出处
- #include <getopt.h> //getopt_long()头文件位置
- int getopt_long (int ___argc, char *const *___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind);
- int getopt_long_only (int ___argc, char *const *___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind);
2、参数介绍
- argc argv :直接从main函数传递而来
- shortopts:短选项字符串。如”n:v",这里需要指出的是,短选项字符串不需要‘-’(经测试需要),而且但选项需要传递参数时,在短选项后面加上“:”。
- longopts:struct option 数组,用于存放长选项参数。
- longind:用于返回长选项在longopts结构体数组中的索引值,用于调试。一般置为NULL
下面介绍struct option
- struct option
- {
- const char *name;//长选项名
- int has_arg;//是否需要参数
- int *flag;
- int val;
- };
name:长选项名字
has_arg:是否需要参数。值有三种情况
- # define no_argument 0 //不需要参数
- # define required_argument 1 //必须指定参数
- # define optional_argument 2 //参数可选
flag和val相互依赖,主要分两种情况:
3、返回值
- 程序中使用短选项,则返回短选项字符(如‘n'),当需要参数是,则在返回之前将参数存入到optarg中。
- 程序中使用长选项,返回值根据flag和val确定。当flag为NULL,则返回val值。所以根据val值做不同的处理,这也说明了val必须唯一。当val值等于短选项值,则可以使用短选项解析函数解析长选项;当flag不为NULL,则将val值存入flag所指向的存储空间,getopt_long返回0
- 出现未定义的长选项或者短选项,getopt_long返回?
- 解析完毕,getopt_long返回-1
4、实例
实例一:
- #include <stdio.h>
- #include <stdlib.h>
- #include <getopt.h> //getopt_long()头文件位置
- int main(int argc, char** argv)
- {
- const char *optstring="n:v";
- int c,deb,index;
- struct option opts[]={{"username",required_argument,NULL,'n'},
- {"version",no_argument,NULL,'v'},
- {"debug",no_argument,&deb,1},
- {0,0,0,0}};
- while((c=getopt_long_only(argc,argv,optstring,opts,&index))!=-1)
- {
- switch(c)
- {
- case 'n'://-n 或者 --username 指定用户名
- printf("username is %s\n",optarg);
- break;
- case 'v'://-v 或者--version,输出版本号
- printf("version is 0.0.1 \n");
- break;
- case 0://flag不为NULL
- printf("debug is %d\n",deb);
- break;
- case '?'://选项未定义
- printf("?\n");
- break;
- default:
- printf("c is %d\n",c);
- break;
- }
- }
- return 0;
- }
实例二:
- #include <stdio.h>
- #include <stdlib.h>
- #include <getopt.h> //getopt_long()头文件位置
- int main(int argc, char** argv)
- {
- const char *optstring="n:v";
- int c,deb,index;
- struct option opts[]={{"username",required_argument,0,0},
- {"n",required_argument,0,0},
- {"version",no_argument,0,0},
- {"v",no_argument,0,0},
- {"debug",no_argument,0,0},
- {"d",no_argument,0,0},
- {"help",no_argument,0,0},
- {"h",no_argument,0,0}};
- while((c=getopt_long_only(argc,argv,optstring,opts,&index))!=-1)
- {
- switch(index){
- //-n或者--username
- case 0:
- case 1:
- printf("username:%s\n",optarg);
- break;
- //-v或者--version
- case 2:
- case 3:
- printf("version:1.0.0\n");
- break;
- //-d or --debug
- case 4:
- case 5:
- printf("debug:yes\n");
- break;
- //-h or --help
- case 6:
- case 7:
- printf("Help:?\n");
- break;
- default:
- printf("other:%d\n",index);
- break;
- }
- }
- return 0;
- }
至于运行结果,我只给出用例,大家有兴趣可以试试。
实例1:./test -n boy
实例2:./test -n boy
Linux编程里getopt_long_only函数用法详解相关推荐
- python lambda函数-Python的Lambda函数用法详解
在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式. 1.为什么要 ...
- linux mount命令参数及用法详解
linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...
- EXCEL公式VLOOKUP函数用法详解
EXCEL公式VLOOKUP函数用法详解 示例下载 VLOOKUP函数 在表格或数值数组的首列查找指定的数值,并由此返回表格或数组中该数值所在行中指定列处的数值. 这里所说的"数组" ...
- python count函数代码_python count函数用法详解_后端开发
fgetc函数的作用详解_后端开发 fgetc函数的作用是从指定文件读入一个字符,要求文件的打开方式必须是以读或读写的方式或者追加的方 式,只写方式是不能读的. 在python中可以使用"c ...
- python中count的作用_python count函数用法详解
在python中可以使用"count()"函数统计字符串里某个字符出现的次数,该函数用于统计次数,其语法是"count(sub, start= 0,end=len(str ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- LayoutInflater的inflate函数用法详解
LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...
- c++ memset 语言_C++中memset函数用法详解
本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...
最新文章
- 静态方法和实例化方法的区别 -转载
- JAVA的网络编程【转】
- python打开火狐浏览器打不开网页_PHP让指定网页只能在微信内置浏览器打开 附代码...
- SELECT的学习以及在socket中的应用
- Java求最小数用哪个函数_在Java中使用小数进行计算的函数
- 程序包android.support.annotation不存在_efcore技巧贴也许有你不知道的使用技巧
- BNU10791:DOTA选人
- MySQL-02-windows下查看frm,myi,myd
- crontab 每天凌晨12点定时器_双十一预售:李佳琦薇娅凌晨12:00点,观看次数双双破亿...
- Hadoop安装教程(Hadoop3.3.1版本),centos7系统,避免踩坑
- 【计算机三级网络技术】 快速求出IP地址块经聚合后的IP地址
- 强化学习——A3C,GA3C
- HTML怎么设置左边外距5像素,css怎么设置左边距
- ES 数据聚合、数据同步、集群
- 工业级嵌入式WiFi模块 无线网关智能家居 WiFi音视频传输模块 WiFi转有线网口模块方案
- 彻底解决联想手机数据连接不能上网问题(无需恢复出厂设置) 本文来自移动叔叔论坛 ,详细出处请参考:http://bbs.ydss.cn/thread-201115-1-1.html
- 设置linux服务器时间自动同步
- 金融壹账通获毕马威金融科技企业50强 金融全产业链优势凸显
- SQL/MYSQL在CMD命令操作符中创建数据库 、表单并插入数据查看
- 如何理解卷积(Convolution)?
热门文章
- 电子信息工程跨考计算机武大,往届从材料跨考武大085208电子与通信工程初试303分 - 考研 - 小木虫 - 学术 科研 互动社区...
- Java抓取淘宝/天猫商品详情
- html锚点反向联动,小程序菜单左右联动
- php 添加样式,添加样式到php html电子邮件
- 网页里面的下拉框与数据库交互
- 问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理
- 批量 材质 调整_游戏图形批量渲染及优化:Unity静态合批技术
- python学习(八)定制类和枚举
- Linux课堂笔记-第二天
- FineReport实现java报表统计图表的效果图