getopt

getopt

表头文件 

#include<unistd.h>

定义函数 

int getopt(int argc,char * const argv[ ],const char * optstring);

extern char *optarg;

extern int optind, opterr, optopt;

函数说明 

getopt()用来分析命令行参数。参数argcargv是由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:

单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给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 */

 

posted @ 2013-05-30 22:05  z折腾  阅读(204)  评论(0编辑  收藏  举报