Linux getopt和getopt_long函数

getopt

函数参数

函数原型为:

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

涉及的全局变量:

extern char *optarg;
extern int optind, opterr, optopt;

包含的头文件:

#include <unistd.h>

先说几个概念:
- 选项:指的是命令行参数中的-符号后面的字母,比如-a中a就是选项。
- 选项参数,指的是选项后面跟的值,有的选项后面必须有个值,有的选项后面没有值,有的选项后面可能有值。

getopt的函数声明中,argc为命令行参数的个数,argv[]为命令行参数列表,optstring为可能出现的选项的列表。
optstring:如果一个选项后面带有:,则该选项必须带选项参数。如果一个选项后面带有::,则该选项后面可能带参数。
如果一个选项后面可能带参数,那么在命令行中,该选项的参数跟该选项之间不能有空格,如果一个选项后面必须带参数,那么选项和它的参数之间可以有空格。
举个例子,比如现在的optarg为abc:d::,那么a和b后面没有参数,c后面必须有参数,d后面可能有参数。我们的命令行参数就可以是

command -a -b -c cvalue -ddvalue

注意,d和dvalue之间没有空格。

全局变量

  • optarg: 指向当前选项的选项参数(如果有的话)
  • optind: 下一个选项的索引。getopt函数会重排命令行参数,所以选项都在argv数组的前面,当argv数组处理完毕后,如果optind >= argc, 就说明出现了过多的选项。
  • opterr: 将opterr设为0,getopt将不打印错误信息。
  • optopt: 当getopt遇到一个未知的选项,或一个选项缺少要求的参数,optopt存储该选项。
  • 返回值:函数的返回值为当前处理的选项,,如果getopt在optstring中找不到该选项或是缺少选项参数,getopt返回’?’,并且打印错误信息。如果optstring的第一个字母是’:’, 那么当缺少选项参数时,getopt返回’:’而不是’?’。如果不再有可识别的选项,getopt返回-1。

getopt_long

getopt_long函数可以处理长选项,就像–help这种,选项长度大于1个字母,需要以–开头。
函数声明:

#include <getopt.h>

int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

前三个参数和getopt一样,第四个参数longopts指向option结构体数组,struct option定义如下:

struct option{
    const char *name;
    int has_arg;
    int *flag;
    int val;
};
  • const char *name: 选项的名字
  • int has_arg:选项是否有参数。它的值为以下三种
符号常量数值含义
no_argument0选项没有参数
required_argument1选项需要参数
optional_argument2选项参数可选

- int *flag 和 int val: 如果flag为NULL, 那么getopt_long返回本结构中val的值;如果flag不为NULL,那么将flag指向的变量设为val的值,getopt_long返回0.通过flag和val,我们就可以在处理命令行参数的同时自动设置标记变量。

参考文章:
http://www.cnblogs.com/oloroso/p/4616282.html
http://www.cppblog.com/flyonok/archive/2010/09/04/125884.aspx
https://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值