Intereting Posts
C эквивалент форматированного списка Измените строку char * в C Неразрешенная ___stdio_common_vsprintf_s, в какой библиотеке это? Являются ли аргументы программы C гарантией ‘\ 0’-прекращения? Компиляторы, поддерживающие C11 Lex regex получает некоторые дополнительные символы Программно получить идентификатор поставщика, идентификатор продукта USB-устройства на платформе Linux Как получить список устройств видеозахвата NAMES (веб-камеры) на linux (ubuntu)? (C / C ++) C: создание массива строк из строки источника с разделителями C Library для сжатия последовательных положительных целых чисел Почему не работает ввод строки? В C, доступ к моему индексу массива быстрее или доступ по указателю быстрее? Подавить предупреждение GCC «дополнительные токены в конце директивы #include» Что означает «» (звездный модификатор) в C? realloc (): недопустимый следующий размер

Предоставление двух аргументов опции командной строки с использованием getopt

есть ли альтернативный способ передать два аргумента в качестве одной строки при использовании getopt? Обычно я бы сделал следующее:

./command -o "key value" [command arguments] 

Тогда мне пришлось бы разделить строку аргумента явно

  while ((op = getopt(argc, argv, "o:")) != EOF) { switch (op) { case 'o': char* result = NULL; result = strtok_r(optarg," "); while(result) { /* DO STUFF */ result = strtok(NULL," "); } break; default: printUsage() break; } 

Итак, мне интересно, можно ли сделать следующее:

 ./command -o key value [command arguments] 

делая getopt рассматривать значение «как» как -о второй аргумент, а не аргумент команды.

Стандарт POSIX getopt() не поддерживает несколько аргументов для одной буквы флага. Есть несколько вариантов, доступных вам.

Один из вариантов – указать имена в качестве аргументов для отдельных букв опций (или использовать один и тот же дважды):

 ./command -o key -v value ./command -o key -o value 

Другой вариант – использовать стандарт POSIX getsubopt() и нотацию командной строки, такую ​​как:

 ./command -o key=value 

Это хорошо работает для вашего показанного сценария, если набор ключей относительно невелик (не так хорошо, если они большие, но вы можете обойтись без getsubopt() затем просто проанализировать optarg для = .

Другой вариант – написать синтаксический анализатор командной строки, который будет принимать несколько аргументов по мере необходимости. Я написал один, чтобы иметь возможность анализировать разнообразные и недисциплинированные аргументы в отношении программ, которые мы используем на работе, – и это не ужасно сложно (хотя и это было нелегко). Он должен обрабатывать значения параметров N (N> 1) после одного флага. Свяжитесь со мной (см. Мой профиль), если вы хотите посмотреть на источник. Есть некоторые сложные проблемы для решения, например, что произойдет, если вы ожидаете 3 имени после буквы опции, но один из первых трех аргументов начинается с тире - или -- появляется. Я допускаю только фиксированное количество аргументов, а не число переменных, но это отчасти потому, что моим вариантам использования не нужно было покрывать переменное число (и это звучит не так, как если бы это было так).

Как getopt знает, где заканчиваются ваши опции -o , и где начинаются ваши command arguments ?

Один простой способ – использовать спецификаторы -o :

 $ cat tc #include #include int main(int argc, char **argv) { char op; while ((op = getopt(argc, argv, "o:")) != EOF) { switch (op) { case 'o': printf("Option: %s\n", optarg); break; default: break; } } } $ gcc tc $ ./a.out -o one -o two -o three Option: one Option: two Option: three