C/C++中命令列參數的原理總結

來源:互聯網
上載者:User

   在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 /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.