锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
聽
1銆佸懡浠よ鍙傛暟
鍛戒護琛岀▼搴忚璁$殑棣栬浠誨姟鏄В鏋愬懡浠よ鍙傛暟錛孏UI媧劇殑紼嬪簭鍛樺緢灝戝叧蹇冭繖涓傝繖閲岋紝鎴戜滑瀵瑰弬鏁幫紙argument錛夐噰鐢ㄤ簡涓縐嶆瘮杈冮氫織鐨勫畾涔夛細鍛戒護琛屼笂闄ゅ懡浠ゅ悕涔嬪鐨勫瓧絎︿覆銆傚弬鏁扮敱澶氶」鏋勬垚錛岄」涓庨」涔嬮棿鐢ㄧ┖鐧界褰兼闅斿紑銆?br />鍙傛暟榪涗竴姝ュ垎涓洪夐」鍜屾搷浣滄暟銆傞夐」鐢ㄤ簬淇敼紼嬪簭鐨勯粯璁よ涓烘垨涓虹▼搴忔彁渚涗俊鎭紝姣旇緝鑰佺殑綰﹀畾鏄互鐭垝綰垮紑澶淬傞夐」鍚庡彲浠ヨ窡闅忎竴浜涘弬鏁幫紝縐頒負閫夐」鍙傛暟銆傚墿涓嬬殑灝辨槸鎿嶄綔鏁頒簡銆?br />2銆丳OSIX綰﹀畾
POSIX琛ㄧず鍙Щ妞嶆搷浣滅郴緇熸帴鍙o細Portable Operating System Interface錛岀數(shù)姘斿拰鐢?shù)瀛愬伐绋嬪笀鍗忎細锛圛nstitute of Electrical and Electronics Engineers錛孖EEE錛夋渶鍒濆紑鍙?POSIX 鏍囧噯錛屾槸涓轟簡鎻愰珮 UNIX 鐜涓嬪簲鐢ㄧ▼搴忕殑鍙Щ妞嶆с傜劧鑰岋紝POSIX 騫朵笉灞闄愪簬 UNIX銆傝澶氬叾瀹冪殑鎿嶄綔緋葷粺錛屼緥濡?DEC OpenVMS 鍜?Microsoft Windows NT錛岄兘鏀寔 POSIX 鏍囧噯銆?br />聽
涓嬮潰鏄疨OSIX鏍囧噯涓叧浜庣▼搴忓悕銆佸弬鏁扮殑綰﹀畾錛?/font>
紼嬪簭鍚嶄笉瀹滃皯浜?涓瓧絎︿笖涓嶅浜?涓瓧絎︼紱
紼嬪簭鍚嶅簲鍙寘鍚皬鍐欏瓧姣嶅拰闃挎媺浼暟瀛楋紱
閫夐」鍚嶅簲璇ユ槸鍗曞瓧絎︽椿鍗曟暟瀛楋紝涓斾互鐭í鈥?鈥樹負鍓嶇洞錛?
澶氫釜涓嶉渶瑕侀夐」鍙傛暟鐨勯夐」錛屽彲浠ュ悎騫躲傦紙璀錛歠oo -a -b -c ---->foo -abc錛?
閫夐」涓庡叾鍙傛暟涔嬮棿鐢ㄧ┖鐧界闅斿紑錛?
閫夐」鍙傛暟涓嶅彲閫夈?
鑻ラ夐」鍙傛暟鏈夊鍊鹼紝瑕佸皢鍏跺茍鏈竴涓瓧涓蹭紶榪涙潵銆傝濡傦細myprog -u "arnold,joe,jane"銆傝繖縐嶆儏鍐典笅錛岄渶瑕佽嚜宸辮В鍐寵繖浜涘弬鏁扮殑鍒嗙闂銆?
閫夐」搴旇鍦ㄦ搷浣滄暟鍑虹幇涔嬪墠鍑虹幇銆?
鐗規(guī)畩鍙傛暟鈥?-'鎸囨槑鎵鏈夊弬鏁伴兘緇撴潫浜嗭紝鍏跺悗浠諱綍鍙傛暟閮借涓烘槸鎿嶄綔鏁般?
閫夐」濡備綍鎺掑垪娌℃湁浠涔堝叧緋伙紝浣嗗浜掔浉鎺掓枼鐨勯夐」錛屽鏋滀竴涓夐」鐨勬搷浣滅粨鏋滆鐩栧叾浠栭夐」鐨勬搷浣滅粨鏋滄椂錛屾渶鍚庝竴涓夐」璧蜂綔鐢紱濡傛灉閫夐」閲嶅錛屽垯欏哄簭澶勭悊銆?
鍏佽鎿嶄綔鏁扮殑欏哄簭褰卞搷紼嬪簭琛屼負錛屼絾闇瑕佷綔鏂囨。璇存槑銆?
璇誨啓鎸囧畾鏂囦歡鐨勭▼搴忓簲璇ュ皢鍗曚釜鍙傛暟'-'浣滀負鏈夋剰涔夌殑鏍囧噯杈撳叆鎴栬緭鍑烘潵瀵瑰緟銆?br />褰撶劧璁稿鏍囧噯浠庢亽璁告湭閬靛畧浠ヤ笂綰﹀畾錛屼富瑕佹槸鍘嗗彶鍏煎闂錛屽洜涓烘爣鍑嗗嚭鐜頒箣鍓嶏紝灝卞凡緇忓瓨鍦∟澶氱▼搴忎簡銆?/font>
3銆丟NU闀塊夐」
GNU榧撳姳紼嬪簭鍛樹嬌鐢?-help銆?-verbose絳夊艦寮忕殑闀塊夐」銆傝繖浜涢夐」涓嶄粎涓嶄笌POSIX綰﹀畾鍐茬獊錛岃屼笖瀹規(guī)槗璁板繂錛屽彟澶栦篃鎻愪緵浜嗗湪鎵鏈塆NU宸ュ叿涔嬮棿淇濇寔涓鑷存х殑鏈轟細銆侴NU闀塊夐」鏈夎嚜宸辯殑綰﹀畾錛?/font>
瀵逛簬宸茬粡閬靛驚POSIX綰﹀畾鐨凣NU紼嬪簭錛屾瘡涓煭閫夐」閮芥湁涓涓搴旂殑闀塊夐」銆?
棰濆閽堝GNU鐨勯暱閫夐」涓嶉渶瑕佸搴旂殑鐭夐」錛屼粎浠呮帹鑽愯鏈夈?
闀塊夐」鍙互緙╁啓鎴愪繚鎸佹儫涓鎬х殑鏈鐭殑瀛椾覆銆?
閫夐」鍙傛暟涓庨暱閫夐」涔嬮棿鎴栭氳繃絀虹櫧瀛楃媧婚氳繃涓涓?='鏉ュ垎闅斻?
閫夐」鍙傛暟鏄彲閫夌殑錛堝彧瀵圭煭閫夐」鏈夋晥錛夈?
闀塊夐」鍏佽浠ヤ竴涓煭妯嚎涓哄墠緙銆?/font>
4銆佸熀鏈殑鍛戒護琛屽鐞嗘妧鏈?br />C紼嬪簭閫氳繃argc鍜宎rgv鍙傛暟璁塊棶瀹冪殑鍛戒護琛屽弬鏁般俛rgc鏄暣鍨嬫暟錛岃〃紺哄弬鏁扮殑涓暟錛堝寘鎷懡浠ゅ悕錛夈俶ain()鍑芥暟鐨勫畾涔夋柟寮忔湁涓ょ錛屽尯鍒粎鍦ㄤ簬argv濡備綍瀹氫箟錛?/font>
int main(int argc, char *argv[])
{
聽聽 鈥︹?br />} int main(int argc, char **argv)
{
聽聽 鈥︹?br />}聽
褰?C 榪愯鏃跺簱鐨勭▼搴忓惎鍔ㄤ唬鐮佽皟鐢ㄦ?zhèn)ㄧ?main() 鏃訛紝宸茬粡瀵瑰懡浠よ榪涜浜嗗鐞嗐俛rgc 鍙傛暟鍖呭惈鍙傛暟鐨勮鏁板鹼紝鑰?argv 鍖呭惈鎸囧悜榪欎簺鍙傛暟鐨勬寚閽堟暟緇勩俛rgv[0]鏄▼搴忓悕銆?/font>
涓涓緢綆鍗曠殑鍛戒護琛屽鐞嗘妧鏈殑渚嬪瓙鏄痚cho紼嬪簭錛屽畠鍙互灝嗗弬鏁拌緭鍑哄埌鏍囧噯璁懼涓婏紝鐢ㄧ┖鏍肩闅斿紑錛屾渶鍚庢崲琛屻傝嫢鍛戒護琛岀涓涓弬鏁頒負-n錛岄偅涔堝氨涓嶄細鎹㈣銆?/font>
娓呭崟1錛?/font>
#include <stdio.h>
int main(int argc, char **argv)
{
聽聽聽 int i, nflg;
聽聽聽 nflg = 0;
聽聽聽 if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'n'){
聽聽聽聽聽聽聽 nflg++;
聽聽聽聽聽聽聽 argc--;
聽聽聽聽聽聽聽 argv++;
聽聽聽 }
聽聽聽 for(i=1; i<argc; i++){
聽聽聽聽聽聽聽 fputs(argv[ i ], stdout);
聽聽聽聽聽聽聽 if(i < argc-1)
聽聽聽聽聽聽聽聽聽聽聽 putchar(' ');
聽聽聽 }
聽聽聽 if(nflg == 0)
聽聽聽聽聽聽聽 putchar('\n');
聽聽聽 return 0;
}
聽
涓婇潰浠g爜涓紝鍔犱寒鍖哄煙浠旂粏鐮旂┒涓涓嬶紝浼氬彂鐜板緢鏈夎叮銆?/font>
echo紼嬪簭涓紝瀵逛簬鍛戒護琛屽弬鏁扮殑瑙f瀽鏄墜鍔ㄥ疄鐜扮殑銆傚緢涔呬互鍓嶏紝Unix鏀寔灝忕粍涓轟簡綆鍖栧浜庡懡浠よ鍙傛暟鐨勮В鏋愶紝寮鍙戜簡getopt()鍑芥暟錛屽悓鏃舵彁渚涗簡鍑犱釜澶栭儴鍙橀噺錛屼嬌寰楃紪鍐欓伒瀹圥OSIX鐨勪唬鐮佸彉寰楁洿鍔犲鏄撲簡銆?/font>
5銆佸懡浠よ鍙傛暟瑙f瀽鍑芥暟 鈥斺?getopt()
getopt()鍑芥暟澹版槑濡備笅錛?/font>
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
聽
璇ュ嚱鏁扮殑argc鍜宎rgv鍙傛暟閫氬父鐩存帴浠巑ain()鐨勫弬鏁扮洿鎺ヤ紶閫掕屾潵銆俹ptstring鏄夐」瀛楁瘝緇勬垚鐨勫瓧涓層傚鏋滆瀛椾覆閲岀殑浠諱竴瀛楃鍚庨潰鏈夊啋鍙鳳紝閭d箞榪欎釜閫夐」灝辮姹傛湁閫夐」鍙傛暟銆?/font>
褰撶粰瀹歡etopt()鍛戒護鍙傛暟鐨勬暟閲?(argc)銆佹寚鍚戣繖浜涘弬鏁扮殑鏁扮粍 (argv) 鍜岄夐」瀛椾覆 (optstring) 鍚庯紝getopt() 灝嗚繑鍥炵涓涓夐」錛屽茍璁劇疆涓浜涘叏灞鍙橀噺銆備嬌鐢ㄧ浉鍚岀殑鍙傛暟鍐嶆璋冪敤璇ュ嚱鏁版椂錛屽畠?yōu)畣杩斿洖涓嬩竴涓夐」錛屽茍璁劇疆鐩稿簲鐨勫叏灞鍙橀噺銆傚鏋滀笉鍐嶆湁鍙瘑鍒殑閫夐」錛屽皢榪斿洖 -1錛屾浠誨姟灝卞畬鎴愪簡銆?/font>
getopt() 鎵璁劇疆鐨勫叏灞鍙橀噺鍖呮嫭錛?/font>
char *optarg鈥斺斿綋鍓嶉夐」鍙傛暟瀛椾覆錛堝鏋滄湁錛夈?
int optind鈥斺攁rgv鐨勫綋鍓嶇儲寮曞箋傚綋getopt()鍦╳hile寰幆涓嬌鐢ㄦ椂錛屽驚鐜粨鏉熷悗錛屽墿涓嬬殑瀛椾覆瑙嗕負鎿嶄綔鏁幫紝鍦╝rgv[optind]鑷砤rgv[argc-1]涓彲浠ユ壘鍒般?
int opterr鈥斺旇繖涓彉閲忛潪闆舵椂錛実etopt()鍑芥暟涓衡滄棤鏁堥夐」鈥濆拰鈥滅己灝戝弬鏁伴夐」錛屽茍杈撳嚭鍏墮敊璇俊鎭?/font>
int optopt鈥斺斿綋鍙戠幇鏃犳晥閫夐」瀛楃涔嬫椂錛実etopt()鍑芥暟鎴栬繑鍥??'瀛楃錛屾垨榪斿洖':'瀛楃錛屽茍涓攐ptopt鍖呭惈浜嗘墍鍙戠幇鐨勬棤鏁堥夐」瀛楃銆?br />涓嬮潰灝辯敤getopt()鏉ュ啓涓皬紼嬪簭錛屼綋楠屼竴涓嬪懡浠よ瑙f瀽鐨勫揩涔愩?/font>
紼嬪簭鎻忚堪錛?/font>
紼嬪簭鍚嶏細opt_parse_demo
閫夐」錛?/font>
-n 鈥斺?鏄劇ず鎴戠殑鍚嶅瓧銆?
-g 鈥斺?鏄劇ず鎴戝コ鏈嬪弸鐨勫悕瀛椼?
-l 鈥斺?甯﹀弬鏁扮殑閫夐」.
娓呭崟2錛?br />#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
聽聽聽 int oc;聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /*閫夐」瀛楃 */
聽聽聽 char *b_opt_arg;聽聽聽聽聽聽聽聽聽聽聽 /*閫夐」鍙傛暟瀛椾覆 */
聽聽聽 while((oc = getopt(argc, argv, "ngl:")) != -1)
聽聽聽 {
聽聽聽聽聽聽聽 switch(oc)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 case 'n':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("My name is Lyong.\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case 'g':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("Her name is Xxiong.\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case 'l':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 b_opt_arg = optarg;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("Our love is %s\n", optarg);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽 return 0;
}
聽
榪愯緇撴灉錛?/font>
$ ./opt_parse_demo -n
My name is Lyong.
$ ./opt_parse_demo -g
Her name is Xxiong.
$ ./opt_parse_demo -l forever
Our love is forever
$ ./opt_parse_demo -ngl forever
My name is Lyong.
Her name is Xxiong.
Our love is forever
聽
6銆佹敼鍙榞etopt()瀵歸敊璇懡浠よ鍙傛暟淇℃伅鐨勮緭鍑鴻涓?br />涓嶆紜殑璋冪敤紼嬪簭鍦ㄦ墍闅懼厤錛岃繖縐嶉敊璇涔堟槸鍛戒護琛岄夐」鏃犳晥錛岃涔堟槸緙哄皯閫夐」鍙傛暟銆傛甯告儏鍐典笅錛実etopt()浼氫負榪欎袱縐嶆儏鍐佃緭鍑鴻嚜宸辯殑鍑洪敊淇℃伅錛屽茍涓旇繑鍥??'銆備負浜嗛獙璇佹浜嬶紝鍙互淇敼涓涓嬩笂闈㈢殑娓呭崟2涓殑浠g爜銆?/font>
娓呭崟3錛?/font>
#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
聽聽聽 int oc;聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /*閫夐」瀛楃 */
聽聽聽 char *b_opt_arg;聽聽聽聽聽聽聽聽聽聽聽 /*閫夐」鍙傛暟瀛椾覆 */
聽聽聽 while((oc = getopt(argc, argv, "ngl:")) != -1)
聽聽聽 {
聽聽聽聽聽聽聽 switch(oc)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 case 'n':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("My name is Lyong.\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽聽 case 'g':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("Her name is Xxiong.\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case 'l':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 b_opt_arg = optarg;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("Our love is %s\n", optarg);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case '?':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("arguments error!\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 return 0;
}
聽
杈撳叆涓涓敊璇殑鍛戒護琛岋紝緇撴灉濡備笅錛?/font>
$ ./opt_parse_demo -l
./opt_parse_demo: option requires an argument -- l
arguments error!
聽
寰堝鏃跺欙紝鎴戜滑涓嶅笇鏈涜緭鍑轟換浣曢敊璇俊鎭紝鎴栨洿甯屾湜杈撳嚭鑷繁瀹氫箟鐨勯敊璇俊鎭傚彲浠ラ噰鐢ㄤ互涓嬩袱縐嶆柟娉曟潵鏇存敼getopt()鍑芥暟鐨勫嚭閿欎俊鎭緭鍑鴻涓猴細
鍦ㄨ皟鐢╣etopt()涔嬪墠錛屽皢opterr璁劇疆涓?錛岃繖鏍峰氨鍙互鍦╣etopt()鍑芥暟鍙戠幇閿欒鐨勬椂鍊欏己鍒跺畠涓嶈緭鍑轟換浣曟秷鎭?
濡傛灉optstring鍙傛暟鐨勭涓涓瓧絎︽槸鍐掑彿錛岄偅涔坓etopt()鍑芥暟灝變細淇濇寔娌夐粯錛屽茍鏍規(guī)嵁閿欒鎯呭喌榪斿洖涓嶅悓瀛楃錛屽涓嬶細
鈥滄棤鏁堥夐」鈥?鈥斺?getopt()榪斿洖'?'錛屽茍涓攐ptopt鍖呭惈浜嗘棤鏁堥夐」瀛楃錛堣繖鏄甯哥殑琛屼負錛夈?
鈥滅己灝戦夐」鍙傛暟鈥?鈥斺?getopt()榪斿洖':'錛屽鏋渙ptstring鐨勭涓涓瓧絎︿笉鏄啋鍙鳳紝閭d箞getopt()榪斿洖'?'錛岃繖浼氫嬌寰楄繖縐嶆儏鍐典笉鑳戒笌鏃犳晥閫夐」鐨勬儏鍐靛尯鍒嗗紑銆?br />澶氳鏃犵泭錛屽姩鎵嬫祴璇曚竴涓嬨?/font>
娓呭崟4錛?br />#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
聽聽聽 int oc;聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /*閫夐」瀛楃 */
聽聽聽 char ec;聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /*鏃犳晥鐨勯夐」瀛楃*/
聽聽聽 char *b_opt_arg;聽聽聽聽聽聽聽聽聽聽聽 /*閫夐」鍙傛暟瀛椾覆 */
聽聽聽 while((oc = getopt(argc, argv, ":ngl:")) != -1)
聽聽聽 {
聽聽聽聽聽聽聽 switch(oc)
聽聽聽聽聽聽聽 {
聽聽聽聽聽聽聽聽聽聽聽 case 'n':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("My name is Lyong.\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽聽 case 'g':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("Her name is Xxiong.\n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case 'l':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 b_opt_arg = optarg;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("Our love is %s\n", optarg);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case '?':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 ec = (char)optopt;
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("鏃犳晥鐨勯夐」瀛楃 \' %c \'!\n", ec);
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽聽聽聽聽 case ':':
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 printf("緙哄皯閫夐」鍙傛暟錛乗n");
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 return 0;
}
嫻嬭瘯緇撴灉錛?/font>
$ ./opt_parse_demo -a
鏃犳晥鐨勯夐」瀛楃 ' a '!
$ ./opt_parse_demo -l
緙哄皯閫夐」鍙傛暟錛?
7銆丟NU鎻愪緵鐨刧etopt()鍑芥暟鐨勭壒鐐?br />涓婇潰鎵璁捐鐨刧etopt()鍑芥暟鏄疷NIX鏀寔灝忕粍鎻愪緵鐨勶紝鍏舵墽琛屾椂涓紕板埌涓嶄互'-'寮濮嬬殑鍛戒護琛屽弬鏁板氨鍋滄瀵繪壘閫夐」銆傝孏NU鎻愪緵鐨刧etopt()鍑芥暟涓庝箣涓嶅悓錛屽畠浼氭壂鎻忔暣涓懡浠よ鏉ュ鎵鵑夐」銆傚綋璋冪敤GNU getopt()鍑芥暟騫跺鐞嗗懡浠よ鍙傛暟鐨勬椂鍊欙紝瀹冮噸鏂版帓鍒梐rgv涓殑鍏冪礌錛岃繖鏍峰綋閲嶆帓緇撴潫鏃訛紝鎵鏈夐夐」閮借縐誨姩鍒板墠闈㈠茍涓旈偅浜涚戶緇鏌rgv[optind]鑷砤rgv[argc-1]涓墿浣欏弬鏁扮殑浠g爜浠嶆甯稿伐浣滐紝浣嗗湪浠諱綍鎯呭喌涓嬶紝紕板埌鐗規(guī)畩鍙傛暟'--'灝辯粨鏉熷閫夐」鐨勬壂鎻忋?/font>
鍙互杈撳叆涓涓貢搴忕殑鍛戒護琛岋紝鏌ョ湅opt_parse_demo鐨勮緭鍑猴細
$ ./opt_parse_demo -l forever a b c d -g -n
Our love is forever
Her name is Xxiong.
My name is Lyong.
聽
GNU getopt()絎簩涓壒鐐規(guī)槸鍙互鍦╫ptstring涓嬌鐢ㄧ壒孌婄殑棣栧瓧絎︽敼鍙榞etopt()鐨勯粯璁よ涓猴細
optstring[0] = '+'錛岃繖鏍峰氨涓嶶NIX鏀寔灝忕粍鎻愪緵鐨刧etopt()寰堢浉榪戜簡銆?
optstring[0] = '-'錛屼細鍦╫ptarg涓緱鍒板懡浠よ涓殑姣忎釜鍙傛暟銆?
浠ヤ笂涓ょ鎯呭喌涓嬶紝':'鍙互浣滀負絎簩涓瓧絎︿嬌鐢ㄣ?br />GNU getopt()絎笁涓壒鐐規(guī)槸optstring涓殑閫夐」瀛楃鍚庨潰鎺ヤ袱涓啋鍙鳳紝灝卞厑璁歌閫夐」鏈夊彲閫夌殑閫夐」鍙傛暟銆傚湪閫夐」鍙傛暟涓嶅瓨鍦ㄧ殑鎯呭喌涓嬶紝GNU getopt()榪斿洖閫夐」瀛楃騫跺皢optarg璁劇疆涓篘ULL銆?/font>
8銆丟NU闀塊夐」鍛戒護琛岃В鏋?br />20 涓栫邯 90 騫翠唬錛孶NIX 搴旂敤紼嬪簭寮濮嬫敮鎸侀暱閫夐」錛屽嵆涓瀵圭煭妯嚎銆佷竴涓弿榪版ч夐」鍚嶇О錛岃繕鍙互鍖呭惈涓涓嬌鐢ㄧ瓑鍙瘋繛鎺ュ埌閫夐」鐨勫弬鏁般?/font>
GNU鎻愪緵浜唃etopt-long()鍜実etopt-long-only()鍑芥暟鏀寔闀塊夐」鐨勫懡浠よ瑙f瀽錛屽叾涓紝鍚庤呯殑闀塊夐」瀛椾覆鏄互涓涓煭妯嚎寮濮嬬殑錛岃岄潪涓瀵圭煭妯嚎銆?/font>
getopt_long() 鏄悓鏃舵敮鎸侀暱閫夐」鍜岀煭閫夐」鐨?getopt() 鐗堟湰銆備笅闈㈡槸瀹冧滑鐨勫0鏄庯細
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
int getopt_long_only(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);
聽
getopt_long()鐨勫墠涓変釜鍙傛暟涓庝笂闈㈢殑getopt()鐩稿悓錛岀4涓弬鏁版槸鎸囧悜option緇撴瀯鐨勬暟緇勶紝option緇撴瀯琚О涓衡滈暱閫夐」琛ㄢ濄俵ongindex鍙傛暟濡傛灉娌℃湁璁劇疆涓篘ULL錛岄偅涔堝畠?yōu)鎸囧悜涓涓彉閲忥紝榪欎釜鍙橀噺浼氳璧嬪間負瀵繪壘鍒扮殑闀塊夐」鍦╨ongopts涓殑绱㈠紩鍊鹼紝榪欏彲浠ョ敤浜庨敊璇瘖鏂?/font>
option緇撴瀯鍦╣etopt.h涓殑澹版槑濡備笅錛?/font>
struct option{
聽聽聽 const char *name;
聽聽聽 int has_arg;
聽聽聽 int *flag;
聽聽聽 int val;
};
聽
瀵圭粨鏋勪腑鐨勫悇鍏冪礌瑙i噴濡備笅錛?/font>
const char *name
榪欐槸閫夐」鍚嶏紝鍓嶉潰娌℃湁鐭í綰褲傝濡?help"銆?verbose"涔嬬被銆?/font>
int has_arg
鎻忚堪浜嗛夐」鏄惁鏈夐夐」鍙傛暟銆傚鏋滄湁錛屾槸鍝綾誨瀷鐨勫弬鏁幫紝姝ゆ椂錛屽畠鐨勫間竴瀹氭槸涓嬭〃涓殑涓涓?/font>
絎﹀彿甯擱噺聽 鏁板悸?鍚箟聽
no_argument聽 0 閫夐」娌℃湁鍙傛暟聽
required_argument 1 閫夐」闇瑕佸弬鏁?
聽
optional_argument 2 閫夐」鍙傛暟鍙壜?
int *flag
濡傛灉榪欎釜鎸囬拡涓篘ULL錛岄偅涔坓etopt_long()榪斿洖璇ョ粨鏋剉al瀛楁涓殑鏁板箋傚鏋滆鎸囬拡涓嶄負NULL錛実etopt_long()浼氫嬌寰楀畠鎵鎸囧悜鐨勫彉閲忎腑濉叆val瀛楁涓殑鏁板鹼紝騫朵笖getopt_long()榪斿洖0銆傚鏋渇lag涓嶆槸NULL錛屼絾鏈彂鐜伴暱閫夐」錛岄偅涔堝畠鎵鎸囧悜鐨勫彉閲忕殑鏁板間笉鍙樸?/font>
int val
榪欎釜鍊兼槸鍙戠幇浜嗛暱閫夐」鏃剁殑榪斿洖鍊鹼紝鎴栬協(xié)lag涓嶆槸NULL鏃惰澆鍏?flag涓殑鍊箋傚吀鍨嬫儏鍐典笅錛岃嫢flag涓嶆槸NULL錛岄偅涔坴al鏄釜鐪燂紡鍋囧鹼紝璀1鎴?錛涘彟涓鏂歸潰錛屽鏋渇lag鏄疦ULL錛岄偅涔坴al閫氬父鏄瓧絎﹀父閲忥紝鑻ラ暱閫夐」涓庣煭閫夐」涓鑷達紝閭d箞璇ュ瓧絎﹀父閲忓簲璇ヤ笌optstring涓嚭鐜扮殑榪欎釜閫夐」鐨勫弬鏁扮浉鍚屻?/font>
姣忎釜闀塊夐」鍦ㄩ暱閫夐」琛ㄤ腑閮芥湁涓涓崟鐙潯鐩紝璇ユ潯鐩噷闇瑕佸~鍏ユ紜殑鏁板箋傛暟緇勪腑鏈鍚庣殑鍏冪礌鐨勫煎簲璇ュ叏鏄?銆傛暟緇勪笉闇瑕佹帓搴忥紝getopt_long()浼氳繘琛岀嚎鎬ф悳绱€備絾鏄紝鏍規(guī)嵁闀垮悕瀛楁潵鎺掑簭浼氫嬌紼嬪簭鍛樿璧鋒潵鏇村鏄撱?/font>
浠ヤ笂鎵璇寸殑flag鍜寁al鐨勭敤娉曠湅涓婂幓鏈夌偣娣蜂貢錛屼絾瀹冧滑寰堟湁瀹炵敤浠峰鹼紝鍥犳鏈夊繀瑕佹悶閫忓交浜嗐?/font>
澶ч儴鍒嗘椂鍊欙紝紼嬪簭鍛樹細鏍規(guī)嵁getopt_long()鍙戠幇鐨勯夐」錛屽湪閫夐」澶勭悊榪囩▼涓璁劇疆涓浜涙爣璁板彉閲忥紝璀鍦ㄤ嬌鐢╣etopt()鏃訛紝緇忓父鍋氬嚭濡備笅鐨勭▼搴忔牸寮忥細
int do_name, do_gf_name, do_love; /*鏍囪鍙橀噺*/
char *b_opt_arg;
while((c = getopt(argc, argv, ":ngl:")) != -1)
{
聽聽聽 switch (c){
聽聽聽 case 'n':
聽聽聽聽聽聽聽 do_name = 1;
聽聽聽 case 'g':
聽聽聽聽聽聽聽 do_gf_name = 1;
聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 break;
聽聽聽 case 'l':
聽聽聽聽聽聽聽 b_opt_arg = optarg;
聽聽聽 鈥︹?br />聽聽聽 }
}
聽
褰揻lag涓嶄負NULL鏃訛紝getopt_long*()浼氫負浣犺緗爣璁板彉閲忋備篃灝辨槸璇翠笂闈㈢殑浠g爜涓紝鍏充簬閫夐」'n'銆?l'鐨勫鐞嗭紝鍙槸璁劇疆涓浜涙爣璁幫紝濡傛灉flag涓嶄負NULL,鏃訛紝getopt_long()鍙互鑷姩涓哄悇閫夐」鎵瀵瑰簲鐨勬爣璁板彉閲忚緗爣璁幫紝榪欐牱灝辮兘澶熷皢涓婇潰鐨剆witch璇彞涓殑涓ょ縐嶆儏鍐靛噺灝戝埌浜嗕竴縐嶃備笅闈㈢粰鍑轟竴涓暱閫夐」琛ㄤ互鍙婄浉搴斿鐞嗕唬鐮佺殑渚嬪瓙銆?/font>
娓呭崟5錛?/font>
#include <stdio.h>
#include <getopt.h>
int do_name, do_gf_name;
char *l_opt_arg;
struct option longopts[] = {
聽聽聽 { "name",聽聽聽聽聽聽聽 no_argument,聽聽聽聽聽聽聽聽聽聽聽 &do_name,聽聽聽聽聽聽聽 1聽聽聽 },
聽聽聽 { "gf_name",聽聽聽 no_argument,聽聽聽聽聽聽聽聽聽聽聽 &do_gf_name,聽聽聽 1聽聽聽 },
聽聽聽 { "love",聽聽聽聽聽聽聽 required_argument,聽聽聽 NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 'l'聽聽聽 },
聽聽聽 {聽聽聽聽 0,聽聽聽 0,聽聽聽 0,聽聽聽 0},
};
int main(int argc, char *argv[])
{
聽聽聽 int c;
聽聽聽
聽聽聽 while((c = getopt_long(argc, argv, ":l:", longopts, NULL)) != -1){
聽聽聽聽聽聽聽 switch (c){
聽聽聽聽聽聽聽 case 'l':
聽聽聽聽聽聽聽聽聽聽聽 l_opt_arg = optarg;
聽聽聽聽聽聽聽聽聽聽聽 printf("Our love is %s!\n", l_opt_arg);
聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 case 0:
聽聽聽聽聽聽聽聽聽聽聽 printf("getopt_long()璁劇疆鍙橀噺 : do_name = %d\n", do_name);
聽聽聽聽聽聽聽聽聽聽聽 printf("getopt_long()璁劇疆鍙橀噺 : do_gf_name = %d\n", do_gf_name);
聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 return 0;
}
聽
鍦ㄨ繘琛屾祴璇曚箣鍓嶏紝鍐嶆潵鍥為【涓涓嬫湁鍏硂ption緇撴瀯涓殑鎸囬拡flag鐨勮鏄庡惂銆?/font>
濡傛灉榪欎釜鎸囬拡涓篘ULL錛岄偅涔坓etopt_long()榪斿洖璇ョ粨鏋剉al瀛楁涓殑鏁板箋傚鏋滆鎸囬拡涓嶄負NULL錛実etopt_long()浼氫嬌寰楀畠鎵鎸囧悜鐨勫彉閲忎腑濉叆val瀛楁涓殑鏁板鹼紝騫朵笖getopt_long()榪斿洖0銆傚鏋渇lag涓嶆槸NULL錛屼絾鏈彂鐜伴暱閫夐」錛岄偅涔堝畠鎵鎸囧悜鐨勫彉閲忕殑鏁板間笉鍙樸?
涓嬮潰嫻嬭瘯涓涓嬶細
$ ./long_opt_demo --name
getopt_long()璁劇疆鍙橀噺 : do_name = 1
getopt_long()璁劇疆鍙橀噺 : do_gf_name = 0
$ ./long_opt_demo --gf_name
getopt_long()璁劇疆鍙橀噺 : do_name = 0
getopt_long()璁劇疆鍙橀噺 : do_gf_name = 1
$ ./long_opt_demo --love forever
Our love is forever!
$ ./long_opt_demo -l forever
Our love is forever!
聽
嫻嬭瘯榪囧悗錛屽簲璇ユ湁鎵鎰熻Е浜嗐傚叧浜巉lag鍜寁al鐨勮璁哄埌姝や負姝€備笅闈㈡葷粨涓涓媑et_long()鐨勫悇縐嶈繑鍥炲肩殑鍚箟錛?/font>
榪斿洖鍊悸犅犅?
聽鍚?涔?br />聽
0聽聽聽聽聽
聽getopt_long()璁劇疆涓涓爣蹇楋紝瀹冪殑鍊間笌option緇撴瀯涓殑val瀛楁鐨勫間竴鏍?br />聽
1
聽姣忕鍒頒竴涓懡浠よ鍙傛暟錛宱ptarg閮戒細璁板綍瀹?br />聽
'?'
聽鏃犳晥閫夐」
聽
':'
聽緙哄皯閫夐」鍙傛暟
聽
'x'
聽閫夐」瀛楃'x'
聽
-1
聽閫夐」瑙f瀽緇撴潫
聽
浠庡疄鐢ㄧ殑瑙掑害鏉ヨ錛屾垜浠洿鏈熸湜姣忎釜闀塊夐」閮藉搴斾竴涓煭閫夐」錛岃繖縐嶆儏鍐典笅錛屽湪option緇撴瀯涓紝鍙灝唂lag璁劇疆涓篘ULL錛屽茍灝唙al璁劇疆涓洪暱閫夐」鎵瀵瑰簲鐨勭煭閫夐」瀛楃鍗沖彲銆傝濡備笂闈㈡竻鍗?涓殑紼嬪簭錛屾垜浠慨鏀瑰涓嬨?/font>
娓呭崟6錛?br />#include <stdio.h>
#include <getopt.h>
int do_name, do_gf_name;
char *l_opt_arg;
struct option longopts[] = {
聽聽聽 { "name",聽聽聽聽聽聽聽 no_argument,聽聽聽聽聽聽聽聽聽聽聽 NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 'n'聽聽聽 },
聽聽聽 { "gf_name",聽聽聽 no_argument,聽聽聽聽聽聽聽聽聽聽聽 NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 'g'聽聽聽 },
聽聽聽 { "love",聽聽聽聽聽聽聽 required_argument,聽聽聽 NULL,聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 'l'聽聽聽 },
聽聽聽 {聽聽聽聽 0,聽聽聽 0,聽聽聽 0,聽聽聽 0},
};
int main(int argc, char *argv[])
{
聽聽聽 int c;
聽聽聽
聽聽聽 while((c = getopt_long(argc, argv, ":l:", longopts, NULL)) != -1){
聽聽聽聽聽聽聽 switch (c){
聽聽聽聽聽聽聽 case 'n':
聽聽聽聽聽聽聽聽聽聽聽 printf("My name is LYR.\n");
聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 case 'g':
聽聽聽聽聽聽聽聽聽聽聽 printf("Her name is BX.\n");
聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 case 'l':
聽聽聽聽聽聽聽聽聽聽聽 l_opt_arg = optarg;
聽聽聽聽聽聽聽聽聽聽聽 printf("Our love is %s!\n", l_opt_arg);
聽聽聽聽聽聽聽聽聽聽聽 break;
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 return 0;
}
嫻嬭瘯緇撴灉濡備笅錛?/font>
$ ./long_opt_demo --name --gf_name --love forever
My name is LYR.
Her name is BX.
Our love is forever!
$ ./long_opt_demo -ng -l forever
My name is LYR.
Her name is BX.
Our love is forever!
聽
9銆佸湪LINUX涔嬪鐨勭郴緇熷鉤鍙頒笂浣跨敤GNU getopt()鎴杇etopt_long()
鍙浠嶨NU紼嬪簭鎴朑NU C Library(GLIBC)鐨凜VS妗f鏂囦歡涓璫opy婧愭枃浠跺嵆鍙紙
http://sourceware.org/glibc/
錛夈傛墍闇婧愭枃浠舵槸getopt.h銆乬etopt.c鍜実etoptl.c錛屽皢榪欎簺鏂囦歡鍖呭惈鍦ㄤ綘鐨勯」鐩腑銆傚彟澶栵紝浣犵殑欏圭洰涓渶濂戒篃灝咰OPYING.LIB鏂囦歡鍖呭惈榪涘幓錛屽洜涓篏NU LGPL錛圙NU 紼嬪簭搴撳叕鍏辮鍙瘉錛夌殑鍐呭鍏ㄩ儴鍖呮嫭鍦ㄥ懡鍚嶄負COPYING.LIB 鐨勬枃浠朵腑銆傛病浜嬫椂錛屽彲浠ラ槄璇諱竴涓嬭嚜鐢辮蔣浠剁殑璁稿彲鍗忚錛屾劅鍙椾竴涓嬮浄閿嬬簿紲炪?/font>
娉ㄦ剰錛屽湪鍖呭惈鎵闇鏂囦歡涔嬪悗錛屽湪璋冪敤getopt_long()緋誨垪鍑芥暟鐨勬簮浠g爜涓紝搴旇浣跨敤#include "getopt.h"錛岃屼笉鏄?include <getopt.h>錛屽墠鑰呬細棣栧厛鍦ㄥ綋鍓嶇洰褰曚腑瀵繪壘getopt.h銆?/font>
浣跨敤Windows騫沖彴鐨勫厔寮熷彲浠ヨ瘯鐢ㄤ竴涓嬶紝寰堝笇鏈涜兘鍦ㄨ繖閲屽弽棣堜竴涓嬩綘鐨勪嬌鐢ㄦ儏鍐碉紝璋㈣阿銆?/font>
10銆佺粨璁?br />紼嬪簭闇瑕佽兘澶熷揩閫熷鐞嗗悇涓夐」鍜屽弬鏁幫紝涓旇姹備笉浼氭氮璐瑰紑鍙戜漢鍛樼殑澶鏃墮棿銆傚湪榪欎竴鐐逛笂錛屾棤璁烘槸GUI(鍥懼艦鐢ㄦ埛浜や簰錛夌▼搴忚繕鏄疌UI錛堝懡浠よ浜や簰錛夌▼搴忥紝閮芥槸鍏墮瑕佷換鍔★紝鍏跺尯鍒粎鍦ㄤ簬瀹炵幇鏂瑰紡鐨勪笉鍚屻侴UI閫氳繃鑿滃崟銆佸璇濇涔嬬被鐨勫浘褰㈡帶浠舵潵瀹屾垚浜や簰錛岃孋UI浣跨敤浜嗙函鏂囨湰鐨勪氦浜掓柟寮忋傚悇鏈夊埄寮婂惂銆傚湪紼嬪簭寮鍙戜腑錛岃澶氭祴璇曠▼搴忕敤CUI鏉ュ畬鎴愭槸棣栭夋柟妗堛?/font>
getopt() 鍑芥暟鏄竴涓爣鍑嗗簱璋冪敤錛屽彲鍏佽鎮(zhèn)ㄤ嬌鐢ㄧ洿鎺ョ殑 while/switch 璇彞鏂逛究鍦伴愪釜澶勭悊鍛戒護琛屽弬鏁板拰媯嫻嬮夐」錛堝甫鎴栦笉甯﹂檮鍔犵殑鍙傛暟錛夈備笌鍏剁被浼肩殑 getopt_long() 鍏佽鍦ㄥ嚑涔庝笉榪涜棰濆宸ヤ綔鐨勬儏鍐典笅澶勭悊鏇村叿鎻忚堪鎬х殑闀塊夐」錛岃繖闈炲父鍙楀紑鍙戜漢鍛樼殑嬈㈣繋銆?
鏃㈢劧宸茬粡鐭ラ亾浜嗗浣曟柟渚垮湴澶勭悊鍛戒護琛岄夐」錛岀幇鍦ㄥ氨鍙互闆嗕腑綺懼姏鏀硅繘鎮(zhèn)ㄧ殑紼嬪簭鐨勫懡浠よ錛屽彲浠ユ坊鍔犻暱閫夐」鏀寔錛屾垨娣誨姞涔嬪墠鐢變簬涓嶆兂鍚戠▼搴忔坊鍔犻澶栫殑鍛戒護琛岄夐」澶勭悊鑰屾悂緗殑浠諱綍鍏朵粬閫夐」銆備絾涓嶈蹇樿鍦ㄦ煇澶勮褰曟?zhèn)ㄦ墍鏈夌殑閫夐」鍜屽弬鏁幫紝騫舵彁渚涙煇縐嶇被鍨嬬殑鍐呯疆甯姪鍑芥暟鏉ヤ負鍋ュ繕鐨勭敤鎴鋒彁渚涘府鍔┿?/font>