2016-10-20 5 views
1

Я использую getopt_long на компьютере GNU/Linux. Initialize список опций как:Как определить, что требуемый аргумент параметра отсутствует?

static struct option long_options[] = { 
    {"mode", required_argument, 0, 9}, 
    {0, 0, 0, 0} 
}; 

Имейте следующую строку кода

c = getopt_long(argc, argv, "", long_options, index_ptr); 

Когда я бегу моя программа с командой: '?'

prog --mode 

Выше показано строка кода возвращает в с, но не «:», как ожидается, в соответствии с getopt(3) человека страницы: «Ошибка и -1 возвращается являются же, как и для Getopt()»

Да, при использовании/разборе короткие варианты можно было бы написать в опции перечисляют что-то вроде «: m:», так что переменная c на отсутствующий аргумент будет содержать «:», а не «?», но что нужно делать, чтобы различать два случая (отсутствующий аргумент, недопустимый параметр) при разборе только длинные варианты?

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

+0

Почему в 'long_options' массива вы использовали 9, как вал должен быть возвращен вместо символа«9»и почему' строка_опций/параметр shortopts' не содержащий «9:» ? (см. [Пример длинных опций анализа] (https://www.gnu.org/software/libc/manual/html_node/Getopt-Long-Option-Example.html#Getopt-Long-Option-Example)) –

+0

@DavidBowling '.val' является' int', но в основном используется, когда указатель '.flag' не равен NULL. Поскольку '9' не может использоваться для определения аргумента shortcut, лучше использовать символ типа' 'm'' (для режима). –

+0

Да, я прочитал раздел getopt [_long] справочника glibc, прежде чем задавать вопрос. Но не ясно, что следует вернуть в этом случае. –

ответ

2

Единственный способ, который я могу видеть, чтобы достичь своей цели различения недопустимого варианта и действительным варианта с отсутствующем аргументом, чтобы установить has_arg поля структуры опций для optional_argument, а затем проверить вручную аргумент. Тогда getopt_long() вернет значение '?' когда есть недопустимая опция, и вы можете проверить, имеет ли указанная опция аргумент, просмотрев optarg. Вот пример:

#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 

int main(int argc, char *argv[]) 
{ 
    int i, opt; 
    int index = -1; 

    static struct option long_options[] = { 
     {"mode", optional_argument, NULL, 'm'}, 
     {0, 0, 0, 0} 
    }; 

    /* suppress error messages */ 
    //opterr = 0; 

    while ((opt = getopt_long(argc, argv, "", long_options, &index)) != -1) { 
     if (opt == '?') { 
      /* do something, perhaps: */ 
      //printf("Invalid option \n"); 
      //  exit(EXIT_FAILURE); 
     } 
     if (opt == 'm' && optarg == NULL) { 
      printf("Missing argument in '--mode' option\n"); 
      exit(EXIT_FAILURE); 
     }   
    } 

    return 0; 
} 
+0

Я тоже об этом думал, проблема в том, что тело с if условностями будет расти, если у вас есть много вариантов, таких как --mode. –

+1

@BulatM .-- Считаете ли вы использование [Argp] (https://www.gnu.org/software/libc/manual/html_node/Argp.html#Argp)? Он выглядит немного более сложным, чем функции 'getopt', но он выглядит более гибким. Возможно, он сможет делать то, что вы хотите. –

Смежные вопросы