Я использую getopt
для синтаксического анализа параметров из командной строки, и у меня возникли проблемы, чтобы распознать необязательный порядок параметров.getopt не получает параметры в некотором порядке
Я хочу, чтобы достичь этих случаев:
$ ./program -i file.html -o output.html #ex 1
$ ./program -i -o file.html output.html #ex 2
$ ./program -o output.html -i file.html #ex 3
мой код выглядит следующим образом
while((c = getopt(argc, argv, "hi:o:")) != -1) {
switch(c) {
case 'h':
//prints the help file
break;
case 'i':
ivalue = optarg;
break;
case 'f':
fvalue = optarg;
break;
case '?':
//prints an error
break;
default:
abort();
}
}
для отладки лучше это я писал вне время
for(int i = optind; i < argc; i++) {
printf("non optional argument %s\n", argv[i]);
return 0;
}
, поэтому примеры 1 и 3 правильно работают, а пример 2 не получает параметры прямо. Сначала я подумал, что с этой функцией просто невозможно, но затем в примере this я видел это.
Существует также вопрос о бонусе: как получилось, что вызов программы без параметров не abort()
?
Я использую ubuntu 15.10 и gcc 5.2.1, установленный с apt-get (dunno, если полезен, но лучше безопасно, что жаль).
Пример №2 не соответствует стандарту командной строки POSIX (реализуется 'getopt'). Опционные аргументы должны следовать за опцией напрямую. – interjay
Пример, с которым вы связались, смутил вас. Вы видите опцию '-a', заменяемую на разные позиции, но обратите внимание, что этот параметр не принимает аргумент. Параметр '-o' принимает аргумент и замечает, что ни один из примеров там не вставляет' -a' между '-o' и его аргументом. Как заметил @interjay, когда опция принимает аргумент, этот аргумент должен следовать за опцией напрямую. –