getopt的用法與optarg

2021-06-20 19:59:00 字數 2506 閱讀 5789

getopt被用來解析命令列選項引數。就不用自己寫東東處理argv了。

#include

extern char *optarg;  //選項的引數指標

extern int optind,   //下一次呼叫getopt的時,從optind儲存的位置處重新開始檢查選項。 

extern int opterr,  //當opterr=0時,getopt不向stderr輸出錯誤資訊。

extern int optopt;  //當命令列選項字元不包括在optstring中或者選項缺少必要的引數時,該選項儲存在optopt中,getopt返回'?』、

int getopt(int argc, char * const argv, const char *optstring);

呼叫一次,返回乙個選項。 在命令列選項引數再也檢查不到optstring中包含的選項時,返回-1,同時optind儲存第乙個不包含選項的命令列引數。

首先說一下什麼是選項,什麼是引數。

字串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。

#include

#include

#include

int main(int argc, char **argv)

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;

}unistd裡有個 optind 變數,每次getopt後,這個索引指向argv裡當前分析的字串的下乙個索引,因此

argv[optind]就能得到下個字串,通過判斷是否以 '-'開頭就可。下面是個測試程式

#include

#include

int main(int argc, char* argv)

else

break;

}printf("\n");

}getchar();

函式說明  getopt()用來分析命令列引數。引數argc和argv是由main()傳遞的引數個數和內容。引數optstring 則代表欲處理的選項字串。此函式會返回在argv 中下乙個的選項字母,此字母會對應引數optstring 中的字母。如果選項字串裡的字母後接著冒號「:」,則表示還有相關的引數,全域變數optarg 即會指向此額外引數。如果getopt()找不到符合的引數則會印出錯資訊,並將全域變數optopt設為「?」字元,如果不希望getopt()印出錯 資訊,則只要將全域變數opterr設為0即可。

返回值  如果找到符合的引數則返回此引數字母,如果引數不包含在引數optstring 的選項字母則返回「?」字元,分析結束則返回-1。

範例  #include

#include

int main(int argc,char **argv)

printf(「optopt +%c\n」,optopt);

}執行  $./getopt –b

option b:b

$./getopt –c

other option:c

$./getopt –a

other option :?

$./getopt –a12345

option a:』12345』

getopt 函式的用法

另外apue的p619有解釋!通常 linux 下的各種命令都有許多的命令列引數可以選擇,比如 gcc g lm foo.c o foo getopt 就是用來分析命令列引數的函式。在繼續討論getopt 之前,先要明確兩個概念 選項 option 和 選項引數 argument 在上面的例子中,g...

函式getopt的用法

函式getopt 用來分析命令列引數,其函式原型和相關變數宣告如下 int getopt int argc,char const argv,const char optstring extern char optarg extern int optind,初始化值為1,下一次呼叫getopt時,從o...

getopt 用法詳解

getopt被用來解析命令列選項引數。就不用自己寫東東處理ar 了。include extern char optarg 選項的引數指標 extern int optind,下一次呼叫getopt的時,從optind儲存的位置處重新開始檢查選項。extern int opterr,當opterr 0...