在c/c++中,命令列參數的傳遞是利用main進行形參傳遞實現
【1】了實現命令列參數我們將使用main(int argc,char* argv[])這樣的形式進行定義argc和argv可以換成你自己喜歡的名稱不一定要用argv,argc這些形式只是習慣而已,char* argv[]我們前面已經講述過,這就是一個指向指標數組,argv就是一個指標數組名,argv不是常量指標,而是具備變數特性的變數指標,它是可以移動的,由 此我們可以改寫成char* *argv也是正確的,int argc這個定義返回的將是參數的個數所以標記為整形(int)。
例如:編寫一命令檔案,把鍵入的字串倒序列印出來。設檔案名稱為invert.c
#include<stdio.h><br />#include<conio.h><br />int main(int argc,char *argv[])<br />{<br />int i;<br />for(i=argc-1;i>0;i--)<br />printf("%s ",argv[i]);<br />getch();<br /> return 0;<br />}
獲得你譯產生後的EXE檔案路徑
運行->輸入CMD
先換到盤:輸入盤符後加冒號
cd 路徑
例如:編譯後的程式在d:/work/invert.exe
運行->cmd
d:
cd /work
invert I love china
【2】在實際程式之中我們經常要對命令列參數進行分析. 比如我們有一個程式a可以接受許多參數.一個可能的情況是
a -d print --option1 hello --option2 world
那麼我們如何對這個命令的參數進行分析了?經常用函數是getopt和getopt_long。
#include <unistd.h><br />#include <getopt.h><br /> <br />int getopt(int argc,char const **argv, const char *optstring);<br />int getopt_long(int argc,char const **argc,const char string,const strUCt option *longopts, int *longindex); </p><p>extern char *optarg;<br />extern int optind,opterr,optopt;<br /> <br />struct option {<br />char *name;<br />int has_flag;<br />int *flag;<br />int value;<br />};<br /> <br />
getopt_long是getopt的擴充.getopt接受的命令列參數只可以是以(-)開頭,而getopt_long還可以接受(--)開頭的參數.一般以(-)開頭的參數的標誌只有一個字母,而以(--)開頭的參數可以是一個字串.如上面的 -d,--option1選項.
argc,和argv參數是main函數的參數.optstring指出了我們可以接受的參數.其一般的形式為:參數1[:]參數2[:].... 其中參數是我們可以接受的參數,假如後面的冒號沒有省略,那麼表示這個參數出現時後面必需要帶參數值. 比如一個optstring為abc:d:表示這個參數選項可以為a,b,c,d其中c,d出現時候必須要有參數值.假如我們輸入了一個我們沒有提供的參數選項.系統將會說 不熟悉的 選項. getopt返回我們指定的參數選項.同時將參數值儲存在optarg中,假如已經分析完成所有的參數函數返回-1.這個時候optind指出非選擇性參數的開始位置.
#include <stdio.h><br />#include <unistd.h> </p><p>int main(int argc,char **argv)<br />{<br /> int is_a,is_b,is_c,is_d,i;<br /> char *a_value,*b_value,*c_value,temp;<br /> is_a=is_b=is_c=is_d=0;<br /> a_value=b_value=c_value=NULL;<br /> if(argc==1)<br /> {<br /> fprintf(stderr,"Usage:%s [-a value] [-b value] [-c value] [-d] arglist ... ",<br /> argv[0]);<br /> exit(1);<br /> }<br /> while((temp=getopt(argc,argv,"a:b:c:d"))!=-1)<br /> {<br /> switch (temp)<br /> {<br /> case 'a':<br /> is_a=1;<br /> a_value=optarg;<br /> break;<br /> case 'b':<br /> is_b=1;<br /> b_value=optarg;<br /> break;<br /> case 'c':<br /> is_c=1;<br /> c_value=optarg;<br /> break;<br /> case 'd':<br /> is_d=1;<br /> break;<br /> }<br /> }<br /> <br /> printf("Option has a:%s with value:%s ",is_a?"YES":"NO",a_value);<br /> printf("Option has b:%s with value:%s ",is_b?"YES":"NO",b_value);<br /> printf("Option has c:%s with value:%s ",is_c?"YES":"NO",c_value);<br /> printf("OPtion has d:%s ",is_d?"YES":"NO");<br /> i=optind;<br /> while(argv[i]) printf(" with arg:%s ",argv[i++]);<br /> exit(0);<br />}
getopt_long比getopt複雜一點,不過用途要比getopt廣泛.struct option 指出我們可以接受的附加參數選項.
name:指出長選項的名稱(如我們的option1)
has_flag:為0時表示沒有參數值,當為1的時候表明這個參數選項要接受一個參數值.為2時表示參數值可以有也可以沒有.
指出函數的傳回值.假如為NULL,那麼返回val,否則返回0.並將longindex賦值為選項所在數組(longopts)的位置.
/* 這個執行個體是從 GNU Libc 手冊上看到的 */<br /> #include <stdio.h><br /> #include <stdlib.h><br /> #include <getopt.h><br /> <br /> <br /> int main (int argc, char **argv)<br /> {<br /> int c;<br /> <br /> while (1)<br /> {<br /> struct option long_options[] =<br /> {<br /> {"add", 1, 0, 0},<br /> {"append", 0, 0, 0},<br /> {"delete", 1, 0, 0},<br /> /* 返回字元c,等同於 -c 選項 */<br /> {"create", 0, 0, 'c'},<br /> {"file", 1, 0, 0},<br /> /* 數組結束 */<br /> {0, 0, 0, 0}<br /> };<br /> /* getopt_long stores the option index here. */<br /> int option_index = 0;<br /> <br /> c = getopt_long (argc, argv, "abc:d:",<br /> long_options, &option_index);<br /> <br /> /* Detect the end of the options. */<br /> if (c == -1)<br /> break;<br /> <br /> switch (c)<br /> {<br /> case 0:<br /> printf ("option %s", long_options[option_index].name);<br /> if (optarg)<br /> printf (" with arg %s ", optarg);<br /> break;<br /> <br /> case 'a':<br /> puts ("option -a ");<br /> break;<br /> <br /> case 'b':<br /> puts ("option -b ");<br /> break;<br /> <br /> /* 可能是-c --creat參數指出來的 */<br /> case 'c':<br /> printf ("option -c with value `%s' ", optarg);<br /> break;<br /> <br /> case 'd':<br /> printf ("option -d with value `%s' ", optarg);<br /> break;<br /> }<br /> }<br /> <br /> exit (0);<br /> }<br />