2013-10-24 34 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