文章新版網址:http://blog.carlcarl.me/11/c-getopt-usage/
getopt是用來判斷程式參數的函式
像是./a.out -s 之類的, getopt能對後面的-s這類參數做判斷處理
一開始要使用的話記得先
#include <unistd.h>
getopt有三個參數(int argc, char* argv[], const char* optsting)
第一個和第二個就直接把main裡頭的參數丟進去就好了
第三個參數就是用來處理前面講到的-s的這類參數
舉個例子來講 像是optstring = "abf"的話 就能夠抓到這三個參數值 如
"./a.out -a" 或 "./a.out -b" 或 "./a.out -abf" 都OK
而如果你的f需要參數 像是後面需要檔案名稱的話 就可以這樣設"abf:"
‘f:'表示f之後需要有個額外的參數, 在處理的時候可以透過optarg來使用這額外的參數
getopt通常會用switch做處理 以上面的例子當作架構
while((c=getopt(argc, argv, "abf:")) != -1) { switch(c) { case 'a': break; case 'b': break; case 'f': puts(optarg); break; case ':': puts("oops"); break; case '?' puts("wrong command"); break; } }
這裡可以透過檢查是否有':'這個字元來判斷是否有漏掉額外的參數 以這裡來講 就是f後面接的檔名
程式如果這樣下的話
./a.out -f
就會印出"oops" 因為後面少了檔名~
'?'則代表這參數錯誤
那如果有時候只想接檔名呢 如
./a.out text.txt
這樣的話 可以在上面的while迴圈之後用argv[optind]來抓text.txt
如果是複數的檔名 如
./a.out text.txt text2.txt
也可以用for迴圈 optind++到argc
for(;optind<argc;optind++) { puts(argv[optind]); //像是這樣 }
參考網址:
http://pubs.opengroup.org/onlinepubs/009695399/functions/getopt.html
留言列表