【知识】--命令行参数编程
1. 新程序开始时典型的栈结构
2. 命令行参数规范
1. 短选项参数规范:
(1)由选项、选项值、操作数组成 (注意操作数的位置不一定)
例: ① gcc test -o test.out
操作数 选项 选项值
②./demo abc -f gg de -s 则操作数为 abc、de
(2)没有选项值的选项可以合二为一 (注意-abc有时表示的选项是-a,选项值是bc;而不是 -a -b -c 注意要根据规则来看)
例:a.out -a -b -c 等价于a.out -abc
(3) 第一次出现的--后面均为操作数
./demo -s abc -- -f -s 则操作数为 abc、-f、-s
2. 长选项参数规范
(1)长选项是--指令(后面可以用等号也可以用空格) 短选项是-指令
./demo.out --name=DYsodg --addr 127.0.0.1 -xabc
3. 命令行参数编程
1. 定义选项规则
(1)短选项规则字符串
例:hab:c::
① 选项后面没有冒号就表示没有参数,例如选项-h、-a
② 选项后面一个冒号,就表示必须要跟参数,例如-b 123 、-b123
③ 选项后面二个冒号,表示可以跟参数也可以不跟。如果跟的话必须不含空格,例如 -c123、-carg
(2)长选项规则结构体
长选项规则必须要通过结构体struct option来定义,并且option数组的最后一个元素必须全部填充0
struct option
{
const char *name; //长选项的名称
int has_arg, //长选项是否带选项值:1为是,0为否,2为可选;
int *flag, //指向用来保存缩写字符的位置, ① 如果flag为NULL,则getopt_long返回缩写字符val;
② 如果flga不为NULL,则getopt_long返回0,flag保存缩写字符val
int val //缩写字符 val指明返回的值,或者需要加载到被flag所指示的变量中的值。
}
2.getopt(……)函数只能解析短选项
(1)int getopt(int argc, char* const argv[],
const char* optstring) //短选项的规则字符串
(2)getopt函数首先对参数进行重新排列
例如: ① 重排前 a.out -f abc 555 -i -s
重排后 a.out -f abc -i -s 555
② 重排前 a.out -f abc 555 -is
重排后 a.out -f abc -is 555
(3)调用getopt函数逐个选项的进行分析与输出,需要配合一下几个已定义好的变量
extern char *optarg; //指向选项值,注意不是选项!!
extern int optind, //表示的是下一个将被getopt()处理到的参数在argv中的下标值
optopt; //选项字符,例如 -c 字符为c
调用一次getopt的结果:
① 选项合法时(即符合短选项规则),返回值为选项字符的ASCII码,optarg指向选项值;
② 选项不合法(短选项规则中没有),返回值为“?”,optopt保存选项字符;
③ 选项合法但缺少选项值, 返回值为“:”,optopt保存选项字符;
④ 所有的选项均解析完, 返回值为-1。
3.getopt_long(……)函数能同时解析短选项和长选项
(1)int getopt_long(int argc, char* const argv[],
const char* optstring, //短选项规则字符串
const struct option * longopts, //长选项规则结构体数组
int *longindex, //保存当前长选项在 长选项规则数据中数组中 第几个
)
(2)getopt_long函数首先对参数进行重新排列,类似getopt
(3)调用getopt_long逐个选项的进行分析与输出,需要配合一下几个已定义好的变量(与getopt函数类似)
extern char *optarg; //指向选项值,注意不是选项!!
extern int optind, //表示的是下一个将被getopt()处理到的参数在argv中的下标值
optopt; //选项字符,例如 -c 字符为c
调用一次getopt_long的结果:
1)所有的短选项和长选项均解析完, 返回值为-1。
2)如果碰到的是短选项
① 选项合法时(即符合短选项规则),返回值为选项字符的ASCII码,optarg指向选项值;
② 选项不合法(短选项规则中没有),返回值为“?”,optopt保存选项字符;
③ 选项合法但缺少选项值, 返回值为“:”,optopt保存选项字符;
2)如果碰到的是长选项
① 如果长选项合法,
若长选项规则结构体option中对应的flag为NULL,那么返回值为对应的缩写字符,optarg指向选项值;
若长选项规则结构体option中对应的falg不为NULL,那么返回值为0,flag保存缩写字符,optatg指向选项值;
②如果长选项不合法 (未验证过)
若长选项规则结构体option中对应的flag为NULL,那么返回值为“?”,optopt保存选项字符;
若长选项规则结构体option中对应的falg不为NULL,那么返回值为0,flag保存“?”,optopt保存选项字符;
③ 如果长选项不合法,但缺少选项值 (未验证过)
若长选项规则结构体option中对应的flag为NULL,那么返回值为“:”,optopt保存选项字符;
若长选项规则结构体option中对应的falg不为NULL,那么返回值为0,flag保存“:”,optopt保存选项字符;