2013-10-24 3 views
0

Прямо сейчас, я пытаюсь заставить мою программу правильно упорядочить флаги, которые я передаю ей в командной строке. Следующая командная строка ./MineEscape --container BINARY infile.txt работает правильно, учитывая, что MineEscape - это имя исполняемого файла. Тем не менее, у меня возникла проблема с запуском этой командной строки ./MineEscape --verbose 15 -c PAIRING infile.txt> outfile.txtGetOpt Long распознает Verbose

Также обратите внимание, что обязательные флаги командной строки --контейнер и типа контейнера, такого как PAIRING или BINARY. Также, как и -verbose, должно следовать целое число.

При запуске неправильной командной строки у меня возникла проблема с подробной частью, говоря, что есть segfault.

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

Вы найдете, что «optarg» имеет значение NULL, несмотря на то, что оно было указано как «v:».

Я обнаружил, что, например, используется «-v3» или «-v 3», который анализирует ок. Но «--verbose 3» терпит неудачу, и «--verbose = 3» работает.

Как ни странно, это поведение, по-видимому, связано с необязательными аргументами.

Это link имеет более

GCC 4.4.6

Смежные вопросы