getopt(分析命令行参数) 相关函数 表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const argv[ ],const char * optstring); 函数说明 getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。 返回值 如果找到符合的参数则返回此参数字母,如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1。 范例 #include<stdio.h> #include<unistd.h> int main(int argc,char **argv) { int ch; opterr = 0; while((ch = getopt(argc,argv,”a:bcde”))!= -1) switch(ch) { case ‘a’: printf(“option a:’%s’/n”,optarg); break; case ‘b’: printf(“option b :b/n”); break; default: printf(“other option :%c/n”,ch); } printf(“optopt +%c/n”,optopt); } 执行 $./getopt –b option b:b $./getopt –c other option:c $./getopt –a other option :? $./getopt –a12345 option a:’12345’ /* 自己写的测试 代码 */ #include<string.h> #include<stdio.h> #include<unistd.h> static int opt_a=0; static int opt_b=0; static int opt_c=0; static int opt_d=0; static int opt_e=0; static char * opt_a_arg=NULL; static void usage() { fprintf(stderr,"Usage:getopt [a arg] [b] [c] [d] [e]/n"); exit(1); } int main(int argc,char **argv) { int opt; char opts[]="a:bcde"; opterr = 0; while((opt = getopt(argc,argv,opts)) != -1){ switch(opt) { case 'a': opt_a=1; opt_a_arg=strdup(optarg); break; case 'b': opt_b=1; break; case 'c': opt_c=1; break; case 'd': opt_d=1; break; case 'e': opt_e=1; break; case '?': usage(); break; } } if(opt_a || opt_b || opt_c|| opt_d || opt_e) { if(opt_a) printf("opt a is set and arg is %s /n",opt_a_arg); if(opt_b) printf("opt b is set/n"); if(opt_c) printf("opt c is set /n"); if(opt_d) printf("opt d is set /n"); if(opt_e) printf("opt e is set /n"); }else usage(); } /* Glib C 的getopt源代码文件中 自带的测试的代码 */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements./n"); digit_optind = this_option_optind; printf ("option %c/n", c); break; case 'a': printf ("option a/n"); break; case 'b': printf ("option b/n"); break; case 'c': printf ("option c with value `%s'/n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??/n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("/n"); } exit (0); } #endif /* TEST */
getopt(分析命令行参数)
猜你喜欢
转载自946265172.iteye.com/blog/2157749
今日推荐
周排行