1. 程式人生 > >C/C++程式的命令列引數

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。

    有關這方面的內容,就解釋到這裡。