Есть ли способ использовать функцию getopt для разбора:
./prog -L -U
так же как:
./prog -LU
Это моя попытка (не работает):
while ((c = getopt(argc, argv, "LU")) != -1) {
switch (c) {
case 'L':
// L catch
break;
case 'U':
// U catch
break;
default:
return;
}
}
В этом простом примере всего 2 параметра, но в моем проекте требуются все комбинации из 6 параметров. Например: -L
или же -LURGHX
или же -LU -RG -H
и т.п.
Можно getopt()
справиться с этим? Или я должен написать сложный парсер, чтобы сделать это?
За исключением пропавшей скобки, ваш код отлично работает для меня:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
int c;
while ((c = getopt(argc, argv, "LU")) != -1) {
switch (c) {
case 'L':
// L catch
printf("L\n");
break;
case 'U':
// U catch
printf("U\n");
break;
default:
break;
}
}
return 0;
}
$ ./a.out -LU L U $ ./a.out -L L $
Он ведет себя именно так, как вы хотели бы:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
int c;
while ((c = getopt(argc, argv, "LU")) != -1) {
switch (c) {
case 'L':
puts("'L' option");
break;
case 'U':
// U catch
puts("'U' option");
break;
default:
puts("shouldn't get here");
break;
}
}
return 0;
}
И проверить это:
precor@burrbar:~$ gcc -o test test.c
precor@burrbar:~$ ./test -LU
'L' option
'U' option
precor@burrbar:~$ ./test -L -U
'L' option
'U' option
getopt()
это стандартная функция POSIX что следует за POSIX «Синтаксические правила Utiltiy», который включает в себя следующее:
Руководящий принцип 5:
Опции без аргументов-параметров должны приниматься, если они сгруппированы за одним разделителем ‘-‘.
getopt
кажется способным справиться с этим, и это делает
Вот несколько примеров, показывающих, что эта программа печатает с различными комбинациями аргументов:
% testopt
aflag = 0, bflag = 0, cvalue = (null)
% testopt -a -b
aflag = 1, bflag = 1, cvalue = (null)
% testopt -ab
aflag = 1, bflag = 1, cvalue = (null)