一、上代碼
#include <stdio.h>
#include <unistd.h>
int main(int argc, char * argv[])
{
? ? int ch;
? ? printf("\n\n");
? ? printf("optind:%d示损,opterr:%d\n",optind,opterr);
? ? printf("--------------------------\n");
? ? while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)
? ? {
? ? ? ? printf("optind: %d\n", optind);
? ? ? ? switch (ch)
? ? ? ? {
? ? ? ? case 'a':
? ? ? ? ? ? printf("HAVE option: -a\n\n");
? ? ? ? ? ? printf("The argument of -a is %s\n\n", optarg);
? ? ? ? ? ? break;
? ? ? ? case 'b':
? ? ? ? ? ? printf("HAVE option: -b\n");
? ? ? ? ? ? printf("The argument of -b is %s\n\n", optarg);
? ? ? ? ? ? break;
? ? ? ? case 'c':
? ? ? ? ? ? printf("HAVE option: -c\n");
? ? ? ? ? ? printf("The argument of -c is %s\n\n", optarg);
? ? ? ? ? ? break;
? ? ? ? case 'd':
? ? ? ? ? ? printf("HAVE option: -d\n");
? ? ? ? ? ? printf("The argument of -d is %s\n\n", optarg);
? ? ? ? ? ? break;
? ? ? ? case 'e':
? ? ? ? ? ? printf("HAVE option: -e\n");
? ? ? ? ? ? printf("The argument of -e is %s\n\n", optarg);
? ? ? ? ? ? break;
? ? ? ? case '?':
? ? ? ? ? ? printf("Unknown option: %c\n",(char)optopt);
? ? ? ? ? ? break;
? ? ? ? }
? }
}
二渗磅、 解析
"ab:c:de::"這個(gè)字符串钦铺,表示程序接收5個(gè)參數(shù)开财,-a,-b鸯旁,-c脆贵,-d医清,-e。其中a和d后面沒接任何冒號(hào)卖氨,說明這個(gè)選項(xiàng)不接收參數(shù)会烙,b和c后面一個(gè)冒號(hào),說明必須接受參數(shù)双泪,可以有空格也可以沒有空格持搜,比如-b 123和-b123都行。最后是e選項(xiàng)有兩個(gè)冒號(hào)焙矛,說明它是可選參數(shù)葫盼,可以接收參數(shù)也可以不接收參數(shù),最為靈活村斟,但是如果有參數(shù)的時(shí)必須是無空格贫导,比如-e123。
optind是全局變量保存下次檢索位置蟆盹,比如option=3孩灯,表示下次從argv[3]又開始解析,optarg是全局變量保存選項(xiàng)對(duì)應(yīng)的參數(shù)逾滥,opterr是全局變量表明是否輸出到stdout峰档。
三、測(cè)試
1. ./toption -a? -b iamb -c iamc -d -eiame-witout-space
optind:1,opterr:1
--------------------------
optind: 2
HAVE option: -a
The argument of -a is (null)
optind: 4
HAVE option: -b
The argument of -b is iamb
optind: 6
HAVE option: -c
The argument of -c is iamc
optind: 7
HAVE option: -d
The argument of -d is (null)
optind: 8
HAVE option: -e
The argument of -e is iame-witout-space
2.?./toption -abLAJI iamb -c iamc -d -eiame-witout-space
optind:1讥巡,opterr:1
--------------------------
optind: 1
HAVE option: -a
The argument of -a is (null)
optind: 2
HAVE option: -b
The argument of -b is LAJI
optind: 5
HAVE option: -c
The argument of -c is iamc
optind: 6
HAVE option: -d
The argument of -d is (null)
optind: 7
HAVE option: -e
The argument of -e is iame-witout-space