Аргументы CLI в C - PullRequest
       31

Аргументы CLI в C

1 голос
/ 20 апреля 2011

Мы разрабатываем программу, которая должна принимать несколько входов одного и того же аргумента. Например,

программа1 -A arg1 -A arg2 -A arg3 -B arg4 -B arg5 -B arg6

Кроме того, аргументы -A и -B имеют отношение 1: 1. Таким образом, arg1 отображается на arg4 и так один.

Итак, является ли приведенный выше пример наилучшим способом предоставления нескольких одинаковых списков аргументов? Или это принятый способ?

Ответы [ 3 ]

5 голосов
/ 20 апреля 2011

Язык C предоставляет функцию getopt для анализа параметров командной строки.Функция getopt_long является расширением GNU, которое анализирует параметры командной строки, которые предоставляют больше функциональных возможностей, чем getopt , например, для анализа многосимвольных параметров.Вы можете найти документацию здесь: http://linux.die.net/man/3/getopt_long или просто человек getopt_long .Позвольте мне показать пример.Допустим, у вас есть программа, которая имеет 3 параметра (-h для справочного сообщения, -i для отображения целого числа и -s для отображения строки).Во-первых, вы должны объявить struct options .Эта структура содержит все параметры, которые нужны вашей программе, и определяется следующим образом:

    struct option {
    const char *name; // the option name
    int has_arg; // if your option has an argument - no_argument (equivalent to 0) if no option and required_argument otherwise (1)
    int *flag; // specifies how results are returned for a long option. If flag is NULL, then getopt_long() returns val
    int val; // is the value to return, or to load into the variable pointed to by flag.
};

Поскольку в вашей программе столько параметров, вы должны объявить массив параметров структуры:

struct option options[] = {
{"help", no_argument, NULL, 'h'}, // for the help msg
{"int", 1, required_argument, 'i'}, // display an int
{"string", required_argument, NULL, 's'}, // displays a string
{NULL, 0, NULL, 0}};

И вы читаете ваши варианты следующим образом:

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

      char opt;
     while ((opt = getopt_long (argc, argv, "his:", options, NULL)) != -1) {
  switch(opt){
        case 'h': printf("Help message \n"); exit(0);
        case 'i': printf("Int options = %d\n", optarg);break;
        case 's': printf("String option = %s\n", optarg); break;
        default:  printf("Help message\n");
   }

    }

Не забудьте включить "getopt.h"

Удачи

1 голос
/ 20 апреля 2011

Если вы начинаете с нуля, вы можете рассмотреть что-то вроде:

program1 arg1,arg4 arg2,arg4 arg3,arg6

Это объединяет аргументы так, как вы описываете, и разделяет каждую пару некоторым символом (запятая в этом примере),Вы можете выбрать подходящий символ-разделитель, который вам подходит.

Нет необходимости использовать соглашение о параметре -X, если вам это не нужно.

0 голосов
/ 20 апреля 2011

Без дополнительной информации это немного расплывчато. Мое мнение, однако, было бы сопоставить их как это

cmd -pair1 argA1 argB1 -pair2 argA2 argB2 ...

или, может быть, что-то вроде следующего. Подумав немного, я бы предпочел это, потому что это самый простой способ сопоставления параметров без необходимости набирать много параметров "types", что не является обязательным.

cmd argA1 argB1 argA2 argB2 ...
...