Параметры соединения Getopt

Есть ли способ использовать функцию 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() справиться с этим? Или я должен написать сложный парсер, чтобы сделать это?

0

Решение

За исключением пропавшей скобки, ваш код отлично работает для меня:

#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
$
2

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

Он ведет себя именно так, как вы хотели бы:

#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:
Опции без аргументов-параметров должны приниматься, если они сгруппированы за одним разделителем ‘-‘.

2

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)
2
По вопросам рекламы [email protected]