一、感性认识:

[c-sharp] 
view plain
copy

 

  1. #include <stdio.h>
  2. #include <getopt.h>
  3. char * l_opt_arg;
  4. char * const short_options = "nbl:"; //单冒号表示是否带有参数[l带有参数后面加冒号]
  5. struct option long_options[] = {
  6. { "name",     0,   NULL,    'n'     },
  7. { "bf_name",  0,   NULL,    'b'     },
  8. { "love",     1,   NULL,    'l'     },
  9. {      0,     0,     0,     0},
  10. };
  11. /*
  12. 长选项我们用一个option结构体数组表示长选项的信息:
  13. 第一项:表示长选项的名字。
  14. 第二项:用来决定此长选项是否要带参数。[这里用数值表示]
  15. 第三项:我们一般都置为NULL,用来决定getopt_long函数的返回值就是第四个选项的值
  16. 第四项:是此长选项相对应的短选项值,因此一旦此函数读到此长选项时,就返回与此长选项相对应的短选项
  17. */
  18. int main(int argc, char *argv[])
  19. {
  20. int c;
  21. while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)
  22. {
  23. switch (c)
  24. {
  25. case 'n':
  26. printf("My name is XL./n");
  27. break;
  28. case 'b':
  29. printf("His name is ST./n");
  30. break;
  31. case 'l':
  32. l_opt_arg = optarg;  //optarg代表参数
  33. printf("Our love is %s!/n", l_opt_arg);
  34. break;
  35. }
  36. }
  37. return 0;
  38. }

编译:

[root@localhost liuxltest]# gcc -o getopt getopt.c

运行1:

[root@localhost liuxltest]# ./getopt -n -b -l forever(这个是参数

My name is XL.

His name is ST.

Our love is forever!

运行2:

[root@localhost liuxltest]# ./getopt -nb -l forever

My name is XL.

His name is ST.

Our love is forever!

运行3:

[root@localhost liuxltest]# ./getopt -nbl forever

My name is XL.

His name is ST.

Our love is forever!

二、概念

getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下:

#include <getopt.h>

int getopt_long(int argc, char * const argv[],

const char *optstring,

const struct option *longopts, int *longindex);

说明:

argc和argv通常直接从main()到两个参数传递而来。

optsting 是选项参数组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。

longopts 是指向数组的指针,这个数组是

struct option {

const char *name;

int has_arg;

int *flag;

int val;

};

const char *name:

选项名,前面没有短横线。譬如"help"、"verbose"之类。

int has_arg:

描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:

符号常量                          数值            含义

no_argument                 0                 选项没有参数

required_argument      1                 选项需要参数

optional_argument       2                 选项参数是可选的

int *flag:

如果该指针为NULL,那么getopt_long返回val字段的值;

如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0

int val:

如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;

longindex 一般赋为NULL即可;如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。

几种常用返回值:

1、每次调用该函数,它都会分析一个选项,并且返回它的短选项,如果分析完毕,即已经没有选项了,则会返回-1。

2、如果getopt_long()在分析选项时,遇到一个没有定义过的选项,则返回值为‘?’,此时,程序员可以打印出所定义命令行的使用信息给用户。

3、当处理一个带参数的选项时,全局变量optarg会指向它的参数

4、当函数分析完所有参数时,全局变量optind(into argv)会指向第一‘非选项’的位置

[置顶] getopt_long函数基本用法-linux的更多相关文章

  1. C语言中getopt()和getopt_long()函数的用法

    一.参考文章 1.C语言中getopt()和getopt_long()函数的用法 2.linux 中解析命令行参数 (getopt_long用法) 二.调试经验

  2. [置顶] access函数-linux

    表头文件 #include<unistd.h> 定义函数 int access(const char * pathname, int mode); 函数说明 检查是否可以读/写某一已存在的 ...

  3. [置顶] getline函数-linux

    头文件: #include <stdio.h> 函数: ssize_t getline(char **lineptr, size_t *n, FILE *stream); eg: ssiz ...

  4. [置顶] mkdir函数-linux

    tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial">

  5. [置顶] 自娱自乐7之Linux UDC驱动2(自编udc驱动,现完成枚举过程,从驱动代码分析枚举过程)

    花了半个月,才搞定驱动中的枚举部分,现在说linux的枚举,windows可能有差别. 代码我会贴在后面,现在只是实现枚举,你可能对代码不感兴趣,我就不分析代码了,你可以看看 在<自娱自乐1&g ...

  6. [置顶] 自娱自乐1之Linux UDC驱动(形式模板)

    首先,我不是做驱动的开发人员.所以只能用自娱自乐来表示我的行为. 我不知道udc和gadget驱动是不是冷门的驱动,资料真是不多.我之前买了一本书,上面说到这些,就教你如何调试已写好的驱动.这样也可以 ...

  7. [置顶] 学习鸟哥的Linux私房菜笔记(6)——过滤器、输入输出及管道

    一.过滤器 Linux中的应用工具分为三种: 交互工具 过滤器 编辑器 能够接受数据,过滤再输出的工具,称之为过滤器 对过滤器和进程,存在着输入源与输出对象 二.输入.输出.重定向 输入:过滤器的数据 ...

  8. [置顶] 自娱自乐6之Linux gadget驱动5(自编gadget驱动,包涵与之通讯的主机usb驱动,已调试通过)

    这个代码调试,你首先要保证你的udc驱动没用问题,这个有些矛盾,应为我本来要用gadget驱动来调试udc驱动,结果反过来了. 这是在zero基础改的,大概的改动 1. 去掉loop. 2. sink ...

  9. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

随机推荐

  1. React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?

    〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...

  2. 【技术分享】ReBreakCaptcha:利用谷歌来破解谷歌的验证码

    概述 从2016年开始,我就在琢磨寻找一种新的绕过谷歌验证码v2的方法会有多难,如果这种方法能够适用于任何环境而不仅仅是针对特定的案例,那这种方法将是非常理想的.接下来我将向你介绍ReBreakCap ...

  3. NEERC2012

    NEERC2012 A - Addictive Bubbles 题目描述:有一个\(n \times m\)的棋盘,还有不同颜色的棋子若干个,每次可以消去一个同种颜色的联通块,得到的分数为联通块中的棋 ...

  4. POJ - Problem 2282 - The Counting Problem

    整体思路:对于每一位,先将当前未达到$limit$部分的段 [如 $0$ ~ $10000$] 直接处理好,到下一位时再处理达到$limit$的部分. · $1 × 10 ^ n$以内每个数(包括$0 ...

  5. 批量删除.svn文件夹和.svn文件

    新建可运行文件 Windows环境 将下面的代码保存为 kill-svn.bat文件,放到要删除.svn文件的目录下,双击运行即可 @echo on @rem 删除SVN版本控制目录 @rem for ...

  6. 头像截图上传三种方式之一(一个简单易用的flash插件)(asp.net版本)

    flash中有版权声明,不适合商业开发.这是官网地址:http://www.hdfu.net/ 本文参考了http://blog.csdn.net/yafei450225664/article/det ...

  7. angular项目文件概览

    在Mac上打开终端,输入ng new b-app  如下: 然后在webstorm中打开 src文件夹 你的应用代码位于src文件夹中. 所有的Angular组件.模板.样式.图片以及你的应用所需的任 ...

  8. nginx同域名动静态分离

    公司需求是如果是app加载静态页面的话要通过应用服务直接请求指定的服务  由于机房迁移  不得不将该文件迁移到一个指定的地方  需要通过nginx配置检测到是访问该静态页面的就转到该静态页面上面进行加 ...

  9. php pdo封装类

    class MYPDO { protected static $_instance = null; protected $dbname = ''; protected $dsn; protected ...

  10. day4迭代器&生成器&正则表达式

    一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不能后退,不过这也没什么,因为人们很少在迭代途中后退.另外,迭代器的一大优点 ...