2013-10-24 37 views
0

現在,我試圖讓我的程序正確地重新調整我在命令行傳遞給它的標誌。以下命令行./MineEscape --container BINARY infile.txt可正常工作,因爲MineEscape是可執行文件的名稱。然而,我遇到了一個問題讓這個命令行工作,./MineEscape --verbose 15 -c PAIRING infile.txt> outfile.txtGetOpt長識別詳情

另外請注意,命令行所需的標誌是--container和一種類型的容器,例如PAIRING或BINARY。以及--verbose後應跟一個整數。

運行不正確的命令行時,我遇到了冗長部分的問題,表示存在段錯誤。

int main(int argc,char **argv){ 


struct arguments{ 
    bool binary; 
    bool poorMan; 
    bool sorted; 
    bool pairing; 
    int outputStatistics; 
} choice; 

const struct option longOpts[]{ 
    {"help",optional_argument,NULL,'h'}, 
    {"container",required_argument,NULL,'c'}, 
    {"verbose",optional_argument,NULL,'v'} 
}; 

stringstream ss; 

int opt=0,longIndex=0; 
opt=getopt_long(argc,argv,"v:c:h",longOpts,&longIndex); 
while(opt!=-1){ 
    switch(opt){ 
     case 'h': 
      //Print out description of executable 

      exit(0); 
      break; 
     case 'c': 
      if(!strcmp("BINARY",optarg)) 
       choice.binary=1; 
      else if(!strcmp("POOR_MAN",optarg)) 
       choice.poorMan=1; 
      else if(!strcmp("SORTED",optarg)) 
       choice.sorted=1; 
      else if(!strcmp("PAIRING",optarg)) 
       choice.pairing=1; 
      else{ 
       ss<<"Sorry, not a valid container implementation\n"; 
       cout<<ss.str(); 
       exit(0); 
      } 
      break; 
     case 'v': 
      if(atoi(optarg)>0) 
       choice.outputStatistics=atoi(optarg); 
      else{ 
       ss<<"Sorry, requires a value greater than 0\n"; 
       cout<<ss.str(); 
       exit(0); 
      } 
      break; 
     default: 

      break; 
    } 
    opt=getopt_long(argc,argv,"v:c:h",longOpts,&longIndex); 
} 
} 

回答

1

儘管指定爲「v:」,但您會發現'optarg'的值爲NULL。

我發現如果使用「-v3」或「-v 3」,例如,解析ok。但是「--verbose 3」失敗,「--verbose = 3」有效。奇怪的是,這種行爲似乎只與可選參數有關。

link有更多的

GCC 4.4.6