及相應的函數

getopt.h和對應的鏈接庫不是每個編譯器都有的,gcc編譯器好像是有的,但是在vs2008是沒有的,所以就要去網上下載跨平臺的代碼,不管怎麼樣,最終要把getopt.h和相應的lib文件和工程鏈接起來,這樣纔不會報錯。這些都比較簡單,現在重點介紹一下getopt.h裏的函數的使用。

     getopt是一個專門設計來減輕命令行處理負擔的庫函數,它可以在全局結構中記錄命令參數,以便隨後隨時在整個程序中使用,即getopt被用來解析命令行選項參數,就不用自己寫代碼處理argv了。其中比較重要的函數是getopt()和getopt_long()。

(1) main()中的兩個參數。聲明main()函數有兩種形式:int main( int argc, char *argv[] ); 和int main( int argc, char **argv );現在前者用的較多。當 C 運行時庫的程序啓動代碼調用 main() 時,已經對命令行進行了處理。argc 參數包含參數的計數值,而 argv 包含指向這些參數的指針數組。對於 C 運行時庫,arguments 是程序的名稱,程序名後的任何內容都應該使用空格加以分隔

例如,如果使用參數 -v bar www.ibm.com 運行一個名爲 foo 程序,您的 argc 將設置爲 4,argv 的設置情況則是:

argv[0] - foo

argv[1] - -v

argv[2] - bar

argv[3] - www.ibm.com

(2) getopt()。getopt()原型是int getopt( int argc, char *const argv[], const char *optstring ); 調用一次,返回一個選項。 在命令行選項參數再也檢查不到optstring中包含的選項時,返回-1,同時optind儲存第一個不包含選項的命令行參數。

首先說一下什麼是選項,什麼是參數和optstring。

字符串optstring可以下列元素:
1.單個字符,表示選項,
2.單個字符後接一個冒號:表示該選項後必須跟一個參數。參數緊跟在選項後或者以空格隔開。該參數的指針賦給optarg。
3 單個字符後跟兩個冒號,表示該選項後必須跟一個參數。參數必須緊跟在選項後不能以空格隔開。該參數的指針賦給optarg。(這個特性是GNU的擴張)。

getopt處理以'-’開頭的命令行參數,如optstring="ab:c::d::",命令行爲getopt.exe -a -b host -ckeke -d haha
在這個命令行參數中,-a和-h就是選項元素,去掉'-',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。


getopt() 所設置的全局變量包括:

optarg——指向當前選項參數(如果有)的指針(optarg不需要定義,在getopt.h中已經有定義)。optind——再次調用 getopt() 時的下一個 argv 指針的索引。optopt——最後一個已知選項。可以重複調用 getopt(),直到其返回 -1 爲止.


(3) getopt_long()的說明。getopt_long的原型是int getopt_long(int argc, char * const argv[],

        const char *optstring,
        const struct option *longopts,
        int *longindex);

這裏參數longopts,其實是一個結構的實例:

struct option {
  const char *name;
   
//name表示的是長參數名
  int has_arg;
   //has_arg有3個值,no_argument(或者是0),表示該參數後面不跟參數值
    //   required_argument(或者是1),表示該參數後面一定要跟個參數值
    //   optional_argument(或者是2),表示該參數後面可以跟,也可以不跟參數值
  int *flag;
    //用來決定,getopt_long()的返回值到底是什麼。如果 flag 成員未設置爲 NULL,在處理期間遇到此選項時,會使用 val 成員的值填充它所指向的 int 值。如果 flag 成員爲 NULL,在 getopt_long() 遇到此選項時,將返回 val 中的值;
  int val;
    //和flag聯合決定返回值

}

將 getop() 調用更改爲了 getopt_long(),除了 getopt() 的參數外,它還接受 longOpts 數組和 int 指針 (longIndex)。當getopt_long() 返回 0 時,longIndex 所指向的整數將設置爲當前找到的長選項的索引。

 

------------------------------------------------------------------------------------------------------------------------------------

另外的參考:

http://blog.sina.com.cn/s/blog_6aea878e0100stkd.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章