GetOpt Long распознает Verbose

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

Также обратите внимание, что обязательными флагами командной строки являются —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);
}
}

0

Решение

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

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

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

это ссылка на сайт имеет больше

gcc 4.4.6

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]