文章新版網址: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

文章標籤
全站熱搜
創作者介紹
創作者 卡卡 的頭像
卡卡

卡卡的程式部落格

卡卡 發表在 痞客邦 留言(0) 人氣(22,717)