C/C++程式的命令列引數
C++程式的main函式有兩個引數:
int main(int argc, char *argv[])
我以前(大學學習的時候)一直沒有弄清楚這兩個引數的真正目的,一直到做Linux C開發的時候,才知道,原來這兩個引數就是用來提供我們在Linux的終端上執行某個命令時,攜帶的額外引數,例如:
$ gcc -o test test.c
在上面這個例子中,
argc == 4
argv == [“gcc”, “-o”, “test”, “test.c”]
大部分Linux程式都需要額外的引數,並且有一套約定俗成的規則,讓這些引數的規範有據可循,因此,Linux系統提供了對這些引數的解析,只要在C++程式中,引入:
include <unistd.h>
就可以使用現成的函式來解析這些引數,與這方面相關的變數與方法有以下幾個:
- extern char *optarg;
- extern int optind;
- extern int opterr;
- extern int optopt;
int getopt(int argc,char * const argv[],const char * optstring);
搞清楚這幾個東西,就可以編寫出一個更強壯的Linux C++程式了。
如果看不懂,可以看例子下面的一一的註解。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int result;
opterr = 0; //使getopt不行stderr輸出錯誤資訊
while( (result = getopt(argc, argv, "ab:c::")) != -1 )
{
switch(result)
{
case 'a':
printf("option=a, optopt=%c, optarg=%s\n", optopt, optarg);
break ;
case 'b':
printf("option=b, optopt=%c, optarg=%s\n", optopt, optarg);
break;
case 'c':
printf("option=c, optopt=%c, optarg=%s\n", optopt, optarg);
break;
case '?':
printf("result=?, optopt=%c, optarg=%s\n", optopt, optarg);
break;
default:
printf("default, result=%c\n",result);
break;
}
printf("argv[%d]=%s\n", optind, argv[optind]);
}
printf("result=-1, optind=%d\n", optind); //看看最後optind的位置
for(result = optind; result < argc; result++)
printf("-----argv[%d]=%s\n", result, argv[result]);
//看看最後的命令列引數,看順序是否改變了哈。
for(result = 1; result < argc; result++)
printf("\nat the end-----argv[%d]=%s\n", result, argv[result]);
return 0;
}
關於getopt的第三個引數:
const char * optstring
,是用來指導getopt函式解析argv中的引數:(引用內容來自上面連結的部落格)
字串optstring可以下列元素,
1.單個字元,表示選項,
2.單個字元後接一個冒號:表示該選項後必須跟一個引數。引數緊跟在選項後或者以空格隔開。該引數的指標賦給optarg。
3 單個字元後跟兩個冒號,表示該選項後必須跟一個引數。引數必須緊跟在選項後不能以空格隔開。該引數的指標賦給optarg。(這個特性是GNU的擴張)。
getopt處理以’-’開頭的命令列引數,如optstring=”ab:c::d::”,命令列為getopt.exe -a -b host -ckeke -d haha
在這個命令列引數中,-a和-b等就是選項元素,去掉’-‘,a,b,c就是選項。host是b的引數,keke是c的引數。但haha並不是d的引數,因為它們中間有空格隔開。
還要注意的是預設情況下getopt會重新排列命令列引數的順序,所以到最後所有不包含選項的命令列引數都排到最後。
如getopt.exe -a ima -b host -ckeke -d haha, 都最後命令列引數的順序是: -a -b host -ckeke -d ima haha
如果optstring中的字串以’+’加號開頭或者環境變數POSIXLY_CORRE被設定。那麼一遇到不包含選項的命令列引數,getopt就會停止,返回-1。有關這方面的內容,就解釋到這裡。