getopt
getopt
表头文件
#include<unistd.h>
定义函数
int getopt(int argc,char * const argv[ ],const char * optstring);
extern char *optarg;
extern int optind, opterr, optopt;
函数说明
getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果在处理期间遇到了不符合optstring指定的其他选项getopt()将显示一个错误消息,并将全域变量optarg设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
getopt() 所设置的全局变量包括:
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个已知选项。
补充说明下optstring中的指定的内容的意义(例如getopt(argc, argv, "ab:c:de::");
1.单个字符,表示选项,(如上例中的abcde各为一个选项)
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。(如上例中的b:c:)
3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::)
1 #include<stdio.h> 2 #include<unistd.h> 3 4 int main(int argc,char **argv) 5 { 6 int ch; 7 opterr =0; 8 9 while((ch=getopt(argc,argv,"a:bcde"))!=-1) 10 { 11 12 switch(ch) 13 { 14 case 'a': 15 printf("option a:%s\n",optarg); 16 break; 17 case 'b': 18 printf("option b:b\n"); 19 break; 20 default: 21 printf("other option:%c\n",ch); 22 } 23 } 24 } 25 /* 26 执行 $./getopt –b 27 option b:b 28 执行 $./getopt –c 29 other option:c 30 执行 $./getopt –a 31 other option :? 32 执行 $./getopt –a12345 33 option a:’12345’ 34 */
1 #include <unistd.h> 2 #include <stdio.h> 3 int main(int argc, char * argv[]) 4 { 5 int aflag=0, bflag=0, cflag=0; 6 int ch; 7 printf("optind:%d,opterr:%d\n",optind,opterr); 8 printf("\n\n\n"); 9 while ((ch = getopt(argc, argv, "ab:c:de::")) != -1) 10 { 11 printf("-------------------------------\n"); 12 printf("optind:%d,argc:%d,argv[%d]:%s\n", optind,argc,optind,argv[optind]); 13 switch (ch) 14 { 15 case 'a': 16 printf("HAVE option: -a\n"); 17 break; 18 case 'b': 19 printf("HAVE option: -b\n"); 20 printf("The argument of -b is %s\n", optarg); 21 break; 22 case 'c': 23 printf("HAVE option: -c\n"); 24 printf("The argument of -c is %s\n", optarg); 25 break; 26 case 'd': 27 printf("HAVE option: -d\n"); 28 break; 29 case 'e': 30 printf("HAVE option: -e\n"); 31 printf("The argument of -e is %s\n", optarg); 32 break; 33 case '?': 34 printf("Unknown option: %c\n",(char)optopt); 35 break; 36 } 37 } 38 return 0; 39 }
1 /* 2 [ztteng@ztteng test]$ ./get0 file1 -a -b -c code -d file2 -e file3 3 optind:1,opterr:1 4 5 6 7 ------------------------------- 8 optind:3,argc:10,argv[3]:-b 9 HAVE option: -a 10 ------------------------------- 11 optind:5,argc:10,argv[5]:code 12 HAVE option: -b 13 The argument of -b is -c 14 ------------------------------- 15 optind:7,argc:10,argv[7]:file2 16 HAVE option: -d 17 ------------------------------- 18 optind:9,argc:10,argv[9]:file3 19 HAVE option: -e 20 The argument of -e is (null) 21 22 执行程序为: 23 0 1 2 3 4 5 6 7 8 9 24 ./get0 file1 -a -b -c code -d file2 -e file3 25 26 扫描过程中,optind是下一个选项的索引, 非选项参数将跳过,同时optind增1。 27 optind初始值为1。 28 29 当扫描argv[1]时,为非选项参数,跳过,optind=2; 30 扫描到-a选项时,下一个将要扫描的选项是-b,则optind更改为3; 31 32 扫描到-b选项时,后面有参数(会认为-c为选项b的参数),optind=5, 33 34 扫描到code非选项跳过optind=6;扫描到-d选项,后面没有参数,optind=7; 35 36 扫描到file2非选项跳过optind=8;扫描到-e后面本来应该有参数,optind=9但是有空格所以e的参数为空。 37 38 扫描结束后,getopt会将argv数组修改成下面的形式 39 0 1 2 3 4 5 6 7 8 9 40 ./get0 -a -b -c -d -e file1 code file2 file3 41 同时,optind会指向非选项的第一个参数,如上面,optind将指向file1 42 */