getopt和getopt_long函数记录

来源:互联网 发布:记录键盘输入的软件 编辑:程序博客网 时间:2024/05/17 02:24

首先,对getopt函数进行整理:

1. 头文件: #include <unistd.h>

2. 函数原型及相关声明:

i> 原型: int getopt (int argc, char *argv[], const char * optstring);

ii> 声明: extern char optarg;

  extern int optind, opterr, optopt;

3. 说明:

getopt 函数将传递给程序的main函数的argc和argv作为参数,同时接受一个选项指定符字符串optstring,该字符串告诉getopt哪些选项可用,以及它们是否有关联值。optstring是一个字符列表,每个字符代表一个单字符选项。如果一个字符后面紧跟一个冒号(:),则表明该选项有一个关联值作为下一个参数。例如:

getopt(argc, agrv, "if:lr"),它允许几个简单的选项:-i, -l,-r和-f,其中-f选项后要紧跟一个文件名参数。

注: 使用相同的参数,但以不同的顺序来调用命令将改变程序的行为。

getopt的返回值是argv数组中的下一个选项字符,循环调用getopt就可以依此得到每个选项。getopt有如下行为:

i> 如果选项有一个关联值,则外部变量optarg指向这个值;

ii> 如果选项处理完毕,getopt返回-1,特殊参数--将使getopt停止扫描选项;

iii> 如果遇到一个无法识别的选项,getopt返回一个问号(?),并把它保存到外部变量optopt中;

iv> 如果一个选项要求有一个关联值,但是用户并未提供这个值,getopt通常将返回一个问号(?)。如果我们将选项字符串的第一个字符设置为冒号(:),那么getopt将在用户未提供值的情况下返回冒号(:)而不是问号(?)。

注:因此为了区分getopt返回问号时意思为“遇到一个无法识别的选项” 和 “需要用户输入一个关联值”,可以将optstring均已冒号(:)开始。这样则在返回问号时即为未识别的选项,返回冒号时即为需要用户输入关联值。


外部变量optind被舍子为下一个待处理参数的索引。getopt利用它来记录自己的进度。


其次,再对getopt_long函数进行整理。总的来说,getopt_long给人的感觉就像是64位操作系统于32位操作系统,有囊括并带有扩充。

1. 头文件: #include <getopt.h>

2. 函数原型:

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

getopt_long 函数比getopt多两个参数。第一个附加参数是一个结构数组,他描述了每个长选项并告诉getopt_long如何处理他们。第二个附加参数是一个变量指针,它可以作为optind的长选项版本使用。对于每个识别的长选项,它在长选项数组中的索引就写入该变量。
长选项结构再头文件getopt.h中定义,并且该头文件必须与常量_GNU_SOURCE一同包含进来,该常量启用getopt_long功能。即头文件的引入应该如下:
#define _GNU_SOURCE
#include <getopt.h>
结构定义如下:
struct option {
const char *name; //长选项的名字,同时也接受缩写,只要不与其他选项混淆
int has_arg; //该选项是否带参数。0:不带参数,1:必须有一个参数,2:有一个可选参数;
int *flag; //设置为NULL表示当找不到该选项时,getopt_long返回在成员val里给出的值。否则,getopt_long返回0,并将val的值写入flag指     //向的变量
int var; //getopt_long为该选项返回的值
};

结构定义示例及函数使用:
struct option longopts[] = {
{"initialize", 0, NULL, 'i'},
{"file", 1, NULL, 'f'},
{"list", 0, NULL, 'l'},
{0, 0, 0, 0}};

函数使用:
while ((opt = getopt_long (argc, argv, ":if:lr", longopts, NULL)) != -1) { ... }

0 0