<1>---<getopt函数的应用>
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 int main(int argc, char **argv)
5 {
6 int result;
7
8 opterr = 0; //使getopt不行stderr输出错误信息
9 char c;
10 int msglen;
11 int readcount;
12 int verbose;
13 while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
14 printf("c = %c\n",c);
15 switch (c) {
16 case 'm':
17 msglen = atoi(optarg);
18 printf("msglen = %d\n", msglen);
19 if (msglen < 0)
20 goto usage;
21 continue;
22 case 'r':
23 readcount = atoi(optarg);
24 if (readcount < 0)
25 goto usage;
26 continue;
27 case 'v':
28 verbose++;
29 continue;
30 case 'h':
31 case '?':
32 usage:
33 fprintf(stderr,
34 "usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
35 argv[0]);
36 return 1;
37
}
38}
说明:c只能取h,m,r,v这四个参数,若参数后面带:(例如h:),即说明该参数后带值。若不是这是个参数则一律认为是'?'参数
<2>---<getopt_long函数的应用>
struct option
----------------------------------
struct option{
const char *name;
int has_arg;
int *flag;
int val;
};
option->name
这是选项名,前面没有短横线。譬如"help"、"verbose"之类。
option->has_arg
描述了选项是否有选项参数。如果有,是哪种类型的参数,此时,它的值一定是下表中的一个。
符号常量 数值 含义
no_argument 0 选项没有参数
required_argument 1 选项需要参数
optional_argument 2 选项参数可选
option->flag
如果这个指针为NULL,那么getopt_long()返回该结构val字段中的数值。如果该指针不为NULL,getopt_long()会将val赋值给flag所指向的变量,并且getopt_long()返回0。如果flag不是NULL,但未发现长选项,那么flag所指向的变量的数值不变。
option->val
这个值是发现了长选项时的返回值,或者flag不是NULL时载入*flag中的值。典型情况下,若flag不是NULL,那么val是个真/假值,譬如1或0;另一方面,如果flag是NULL,那么val通常是字符常量,若长选项与短选项一致,那么该字符常量应该与optstring中出现的这个选项的参数相同。
例程1
----------------------------------
#include <stdio.h>
#include <getopt.h>
int do_name, do_gf_name;
char *l_opt_arg;
struct option longopts[] = {
{ "name", no_argument, &do_name, 2 },
{ "gf_name", no_argument, &do_gf_name, 1 },
{ "love", required_argument, NULL, 'l' },
{ 0, 0, 0, 0},
};
int main(int argc, char *argv[])
{
int c;
while((c = getopt_long(argc, argv, ":l:", longopts, NULL)) != -1){
switch (c){
case 'l':
l_opt_arg = optarg;
printf("Our love is %s!\n", l_opt_arg);
break;
case 0:
printf("getopt_long()设置变量 : do_name = %d\n", do_name);
printf("getopt_long()设置变量 : do_gf_name = %d\n", do_gf_name);
break;
}
}
return 0;
}
输入参数 --name,getopt_long()返回0,然后将do_name置为2
输入参数 --gf_name,getopt_long()返回0,然后将do_gf_name置为1
输入参数 --love forever,getopt_long()返回'l'
输入参数 -l forever,getopt_long()同样返回'l',但是这里已经不再是长参数了,与longopts没有关系。
例程2
----------------------------------
#include <stdio.h>
#include <getopt.h>
int do_name, do_gf_name;
char *l_opt_arg;
struct option longopts[] = {
{ "name", no_argument, NULL, 'n' },
{ "gf_name", no_argument, NULL, 'g' },
{ "love", required_argument, NULL, 'l' },
{ 0, 0, 0, 0 },
};
int main(int argc, char *argv[])
{
int c;
while((c = getopt_long(argc, argv, ":l:", longopts, NULL)) != -1){
switch (c){
case 'n':
printf("My name is LYR.\n");
break;
case 'g':
printf("Her name is BX.\n");
break;
case 'l':
l_opt_arg = optarg;
printf("Our love is %s!\n", l_opt_arg);
break;
}
}
return 0;
}
本进程可以接受的参数:
长参数:
--name
--gf_name
--love
短参数:
-l
不能接受短参数:
-n
-g