文章新版網址: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) 人氣()