2016-04-25 4 views
1

Мне нужно проанализировать аргументы с помощью функции getopt. Проблема в том, что если у меня есть аргументы до и/или после опций, getopt не работает. Обработка опций прекращается, как только возникает аргумент nonoption.getopt в Mac OS X

Для примера: tftp ip port [-b blksize] src dest не работает. Но tftp [-b blksize] ip port src dest хорошо работает.

Видимо, мне нужно добавить + в начале optstring, чтобы иметь возможность смешивать аргументы и варианты, но он не поддерживается Max OS X согласно https://www.gnu.org/software/gnulib/manual/html_node/getopt.html

Есть ли у вас решение? Благодарю.

+0

Этот документ относится к OSX 10.5. Думаю, мы сегодня 10.10. –

+0

@MarkSetchell Версия не имеет значения, OS X - система BSD. BSD getopt не поддерживает расширения GNU. Также у меня открыта страница 10.11. – Schwern

+0

В качестве альтернативы вы можете использовать очень функциональный [Gnome lib command line parser] (https://developer.gnome.org/glib/stable/glib-Commandline-option-parser.html). – Schwern

ответ

3

Изменить то, что вы проходите getopt, как argv и argc, чтобы пропустить часть команды.

Например, tftp ip port [-b blksize] src dest Вы бы притворили port по адресу argv[2] is argv[0]. Позвоните по телефону getopt(argc - 2, argv + 2, optstring).

#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char *argv[]){ 
    int ch; 

    while((ch = getopt(argc - 2, argv + 2, "b:")) != -1) { 
     printf("%c %s\n", ch, optarg); 
    } 

    return 0; 
} 

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

+0

Вот что я сделал, он работает. Но я думаю, что это грязное решение ... – Mathieu

+0

Я не согласен. Вам, вероятно, нужно знать если параметры применимы к команде вообще в подкоманде. Это, например, [как работает git] (https://www.kernel.org/pub/software/scm/git/docs/). Если есть что-либо грязный здесь, он использует короткие варианты. Вы должны использовать 'getopt_long'. – Schwern

+0

Хорошо, пойдем, спасибо :) – Mathieu