专注细节
努力进步

The Linux Environment之getopt_long()

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

字符串optstring可以下列元素:

1.单个字符,表示选项,

2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。

3 单个字符后跟两个冒号,表示该选项后可以有参数也可以没有参数。如果

有参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是gnu的扩张)。

optstring是一个字符串,表示可以接受的参数。例如,”a:b:cd”,表示可以接受的参数是a,b,c,d,其中,a和b参数后面跟有更多的参数值。(例如:-a host -b name)

struct option {

const char *name; //name表示的是长参数名

int has_arg; //has_arg有3个值,no_argument(或者是0),表示该参数后面不跟参数值

// required_argument(或者是1),表示该参数后面一定要跟个参数值

// optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值

int *flag;

//用来决定,getopt_long()的返回值到底是什么。如果flag是null,则函数会返回与该项option匹配的val值

int val; //和flag联合决定返回值

}

linux程序设计这本书172页代码中option结构体了 某一条{“initialize”,0,null,’i’},为什么在之后运行代码,使用./longopt –init –i 或者少写几个字母都行!!!!这个要注意 file选项也是这样的 好强大!!!!但是不会有有些地方比如两个选项前几个字母相同的时候参数会有问题吗?

测试一下!!!

将其中代码的file选项改为initialize123之后发现,不能使用无法判断所使用对象的缩写了 ,也就是说至少要写到intialize,但是之后可以也是缩写如intialize1也是可以读到那个选项的!!!很灵活,很强大。

分享到:更多 ()