getopt函数与getopt_long函数的用法

<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
 

你可能感兴趣的:(c,struct,null)