在程序中难免需要使用命令行选项,可以选择自己解析命令行选项,但是有现成的,何必再造轮子。下面介绍使用getopt_long_only和getopt_long( 两者用法差不多 )解析命令行选项。

程序中主要使用:

短选项 长选项 是否需要参数
-n --username 是(用户名) 指定用户名
-d --debug 是否已测试

1、函数出处

  1. #include <getopt.h> //getopt_long()头文件位置
  2. int getopt_long (int ___argc, char *const *___argv,
  3. const char *__shortopts,
  4. const struct option *__longopts, int *__longind);
  5. int getopt_long_only (int ___argc, char *const *___argv,
  6. const char *__shortopts,
  7. const struct option *__longopts, int *__longind);

2、参数介绍

  • argc argv :直接从main函数传递而来
  • shortopts:短选项字符串。如”n:v",这里需要指出的是,短选项字符串不需要‘-’(经测试需要),而且但选项需要传递参数时,在短选项后面加上“:”。
  • longopts:struct option 数组,用于存放长选项参数。
  • longind:用于返回长选项在longopts结构体数组中的索引值,用于调试。一般置为NULL

下面介绍struct option

  1. struct option
  2. {
  3. const char *name;//长选项名
  4. int has_arg;//是否需要参数
  5. int *flag;
  6. int val;
  7. };

name:长选项名字 
has_arg:是否需要参数。值有三种情况

  1. # define no_argument        0    //不需要参数
  2. # define required_argument  1    //必须指定参数
  3. # define optional_argument  2    //参数可选

flag和val相互依赖,主要分两种情况:

(1)、flag为NULL,val值用于确定该长选项,所以需要为长选项指定唯一的val值。这里也为长选项和短选项建立了桥梁。
            实际就是用于长选项和短选项的对应关系
(2)、flag不为NULL,则将val值存放到flag所指向的存储空间,用于标识该长选项出现过。

3、返回值

  • 程序中使用短选项,则返回短选项字符(如‘n'),当需要参数是,则在返回之前将参数存入到optarg中。
  • 程序中使用长选项,返回值根据flag和val确定。当flag为NULL,则返回val值。所以根据val值做不同的处理,这也说明了val必须唯一。当val值等于短选项值,则可以使用短选项解析函数解析长选项;当flag不为NULL,则将val值存入flag所指向的存储空间,getopt_long返回0
  • 出现未定义的长选项或者短选项,getopt_long返回?
  • 解析完毕,getopt_long返回-1

4、实例

理论要与实际相结合
实例一:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <getopt.h> //getopt_long()头文件位置
  4. int main(int argc, char** argv)
  5. {
  6. const char *optstring="n:v";
  7. int c,deb,index;
  8. struct option opts[]={{"username",required_argument,NULL,'n'},
  9. {"version",no_argument,NULL,'v'},
  10. {"debug",no_argument,&deb,1},
  11. {0,0,0,0}};
  12. while((c=getopt_long_only(argc,argv,optstring,opts,&index))!=-1)
  13. {
  14. switch(c)
  15. {
  16. case 'n'://-n 或者 --username 指定用户名
  17. printf("username is %s\n",optarg);
  18. break;
  19. case 'v'://-v 或者--version,输出版本号
  20. printf("version is 0.0.1 \n");
  21. break;
  22. case 0://flag不为NULL
  23. printf("debug is %d\n",deb);
  24. break;
  25. case '?'://选项未定义
  26. printf("?\n");
  27. break;
  28. default:
  29. printf("c is %d\n",c);
  30. break;
  31. }
  32. }
  33. return 0;
  34. }

实例二:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <getopt.h> //getopt_long()头文件位置
  4. int main(int argc, char** argv)
  5. {
  6. const char *optstring="n:v";
  7. int c,deb,index;
  8. struct option opts[]={{"username",required_argument,0,0},
  9. {"n",required_argument,0,0},
  10. {"version",no_argument,0,0},
  11. {"v",no_argument,0,0},
  12. {"debug",no_argument,0,0},
  13. {"d",no_argument,0,0},
  14. {"help",no_argument,0,0},
  15. {"h",no_argument,0,0}};
  16. while((c=getopt_long_only(argc,argv,optstring,opts,&index))!=-1)
  17. {
  18. switch(index){
  19. //-n或者--username
  20. case 0:
  21. case 1:
  22. printf("username:%s\n",optarg);
  23. break;
  24. //-v或者--version
  25. case 2:
  26. case 3:
  27. printf("version:1.0.0\n");
  28. break;
  29. //-d or --debug
  30. case 4:
  31. case 5:
  32. printf("debug:yes\n");
  33. break;
  34. //-h or --help
  35. case 6:
  36. case 7:
  37. printf("Help:?\n");
  38. break;
  39. default:
  40. printf("other:%d\n",index);
  41. break;
  42. }
  43. }
  44. return 0;
  45. }

至于运行结果,我只给出用例,大家有兴趣可以试试。
实例1:./test -n boy

实例2:./test -n boy

Linux编程里getopt_long_only函数用法详解相关推荐

  1. python lambda函数-Python的Lambda函数用法详解

    在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式. 1.为什么要 ...

  2. linux mount命令参数及用法详解

    linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...

  3. EXCEL公式VLOOKUP函数用法详解

    EXCEL公式VLOOKUP函数用法详解 示例下载 VLOOKUP函数 在表格或数值数组的首列查找指定的数值,并由此返回表格或数组中该数值所在行中指定列处的数值. 这里所说的"数组" ...

  4. python count函数代码_python count函数用法详解_后端开发

    fgetc函数的作用详解_后端开发 fgetc函数的作用是从指定文件读入一个字符,要求文件的打开方式必须是以读或读写的方式或者追加的方 式,只写方式是不能读的. 在python中可以使用"c ...

  5. python中count的作用_python count函数用法详解

    在python中可以使用"count()"函数统计字符串里某个字符出现的次数,该函数用于统计次数,其语法是"count(sub, start= 0,end=len(str ...

  6. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  7. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  8. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  9. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

最新文章

  1. 静态方法和实例化方法的区别 -转载
  2. JAVA的网络编程【转】
  3. python打开火狐浏览器打不开网页_PHP让指定网页只能在微信内置浏览器打开 附代码...
  4. SELECT的学习以及在socket中的应用
  5. Java求最小数用哪个函数_在Java中使用小数进行计算的函数
  6. 程序包android.support.annotation不存在_efcore技巧贴也许有你不知道的使用技巧
  7. BNU10791:DOTA选人
  8. MySQL-02-windows下查看frm,myi,myd
  9. crontab 每天凌晨12点定时器_双十一预售:李佳琦薇娅凌晨12:00点,观看次数双双破亿...
  10. Hadoop安装教程(Hadoop3.3.1版本),centos7系统,避免踩坑
  11. 【计算机三级网络技术】 快速求出IP地址块经聚合后的IP地址
  12. 强化学习——A3C,GA3C
  13. HTML怎么设置左边外距5像素,css怎么设置左边距
  14. ES 数据聚合、数据同步、集群
  15. 工业级嵌入式WiFi模块 无线网关智能家居 WiFi音视频传输模块 WiFi转有线网口模块方案
  16. 彻底解决联想手机数据连接不能上网问题(无需恢复出厂设置) 本文来自移动叔叔论坛 ,详细出处请参考:http://bbs.ydss.cn/thread-201115-1-1.html
  17. 设置linux服务器时间自动同步
  18. 金融壹账通获毕马威金融科技企业50强 金融全产业链优势凸显
  19. SQL/MYSQL在CMD命令操作符中创建数据库 、表单并插入数据查看
  20. 如何理解卷积(Convolution)?

热门文章

  1. 电子信息工程跨考计算机武大,往届从材料跨考武大085208电子与通信工程初试303分 - 考研 - 小木虫 - 学术 科研 互动社区...
  2. Java抓取淘宝/天猫商品详情
  3. html锚点反向联动,小程序菜单左右联动
  4. php 添加样式,添加样式到php html电子邮件
  5. 网页里面的下拉框与数据库交互
  6. 问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理
  7. 批量 材质 调整_游戏图形批量渲染及优化:Unity静态合批技术
  8. python学习(八)定制类和枚举
  9. Linux课堂笔记-第二天
  10. FineReport实现java报表统计图表的效果图