Я программирую на C ++ в среде Linux и пытаюсь проанализировать аргументы командной строки, используя getopt. Я хочу требовать ввод -s ИЛИ -q (longforms —stack и —queue соответственно), а не оба, а также ввод -o с обязательным аргументом:
int opt = 0, index = 0, stack=-1, map=-1;
while((opt = getopt_long (argc, argv, ":sqho:", longOpts, &index)) != -1){
cout<<opt;
switch(opt) {
case 's':
stack=0;
cout << "Stack"<<stack<<"\n";
break;
case 'q':
stack=1;
cout << "Queue"<<stack<<"\n";
//optarg is defined in getopt.h
break;
case 'h':
cout<< "To run this program, use one of the valid cmd line args (longforms: stack, queue, help, output (M|L); shortforms: s, q, h, o (M|L), respectiely) \naccompanied with appropriate file redirection";
exit(0);
break;
case 'o':
//opt is 'M' or 'L'
cout<<"output method is: "<<optarg<<"\n";
if(*optarg=='M') map=1;
else if(*optarg=='L') map=0;
else map=-1;
cout<<map<<"\n";
case ':':
cerr<<"Map or list output must be specified as an argument to -o: "<<opt<<"\n";
case '?':
cerr << "Command line error. one or more flags not recognized: " <<opt<<"\n";
//exit(1);
break;
}
}
for(int i=1; i<argc; i++){
cout<<*argv[i]<<endl;
}
return 0;
}
Он содержит правильный #include в верхней части и прекрасно компилируется.
Однако, когда я пытаюсь запустить ./hunt -q -o M, дела ‘q’, ‘o’, ‘:’ и ‘?’ все выполнить. Я решил вывести любой символ, который вызывал ‘:’ и ‘?’ блоков, и консоль отображает 111, значение ASCII символа «o».
Меня это очень смущает, так как после того, как getopt запускает блок ‘o’, разве он не должен возвращать -1, означая, что больше нет аргументов командной строки? Буду признателен за любую помощь / предложения. Спасибо!
Вам не хватает break
в case 'o'
а также case ':'
,
Это вызывает провал из o
в :
в ?
,
Других решений пока нет …