Getopt – параметр передачи строки для аргумента

У меня есть программа, которая принимает несколько аргументов командной строки, поэтому я использую getopt. Один из моих аргументов принимает строку как параметр. В любом случае, чтобы получить эту строку через функцию getopt или мне нужно получить ее через массив argv []? Также может getopt читать args вроде -file ? Все аргументы, которые я видел до сих пор, имеют только один символ, такой как -a

РЕДАКТИРОВАТЬ

Из нижеприведенных ответов я написал программу для использования getopt_long (), но оператор switch только распознает аргумент, когда я использую аргумент character, а не длинный аргумент. Я не знаю, почему это происходит. При передаче аргументов -mf -file sample я не вижу операторов печати.

РЕДАКТИРОВАТЬ

Я попытался ввести аргументы команды as --file а затем он сработал. Разве это невозможно сделать с помощью простого -file ?

 static struct option long_options[] = { {"mf", required_argument, NULL, 'a'}, {"md", required_argument, NULL, 'b'}, {"mn", required_argument, NULL, 'c'}, {"mw", required_argument, NULL, 'd'}, {"lf", required_argument, NULL, 'e'}, {"ld", required_argument, NULL, 'f'}, {"ln", required_argument, NULL, 'g'}, {"lw", required_argument, NULL, 'h'}, {"rf", required_argument, NULL, 'i'}, {"rd", required_argument, NULL, 'j'}, {"rn", required_argument, NULL, 'k'}, {"rw", required_argument, NULL, 'l'}, {"df", required_argument, NULL, 'm'}, {"dd", required_argument, NULL, 'n'}, {"dn", required_argument, NULL, 'o'}, {"dw", required_argument, NULL, 'p'}, {"file", required_argument, NULL, 'q'}, {NULL, 0, NULL, 0} }; int ch=0; while ((ch = getopt_long(argc, argv, "abcdefghijklmnopq:", long_options, NULL)) != -1) { // check to see if a single character or long option came through switch (ch){ case 'a': cout<<"title"; break; case 'b': break; case 'c': break; case 'd': break; case 'e': break; case 'f': break; case 'g': break; case 'h': break; case 'i': break; case 'j': break; case 'k': break; case 'l': break; case 'm': break; case 'n': break; case 'o': break; case 'p': break; case 'q': cout<<"file"; break; case '?': cout<<"wrong message" break; } } 

Читайте man getopt http://linux.die.net/man/3/getopt

optstring – строка, содержащая законные символы опции. Если за таким символом следует двоеточие, параметр требует аргумента, поэтому getopt () помещает указатель на следующий текст в том же argv-элементе или в текст следующего argv-элемента в optarg. Два двоеточия означают, что опция принимает необязательный аргумент arg; если в текущем argv-элементе есть текст (т. е. в том же слове, что и имя параметра, например, «-oarg»), то оно возвращается в optarg, иначе optarg устанавливается в ноль.

Пример кода:

 #include  #include  int main (int argc, char *argv[]) { int opt; while ((opt = getopt (argc, argv, "i:o:")) != -1) { switch (opt) { case 'i': printf ("Input file: \"%s\"\n", optarg); break; case 'o': printf ("Output file: \"%s\"\n", optarg); break; } } return 0; } 

Здесь в optstring «i: o:» символ двоеточия: »после каждого символа в строке, сообщает, что для этих параметров потребуется аргумент. Аргумент можно найти как строку в глобальном var var. См. Руководство для подробностей и других примеров.

Для более чем одного символьного переключателя параметров см. Длинные параметры getopt_long . Для примера см. Руководство.

EDIT в ответ на сингл «-» длинные варианты:

С man-страниц

getopt_long_only () похож на getopt_long (), но ‘-‘, а также – – может указывать длинный вариант. Если параметр, начинающийся с «-» (не «-»), не соответствует длинному варианту, но соответствует короткой опции, он анализируется как короткий вариант.

Проверьте руководство и попробуйте.

Чтобы указать, что для флага требуется аргумент, добавьте «:» сразу после флага в переменной short_opt. Чтобы использовать длинные аргументы, используйте getopt_long ().

Вот краткая примерная программа:

 #include  #include  int main(int argc, char * argv[]); int main(int argc, char * argv[]) { int c; const char * short_opt = "hf:"; struct option long_opt[] = { {"help", no_argument, NULL, 'h'}, {"file", required_argument, NULL, 'f'}, {NULL, 0, NULL, 0 } }; while((c = getopt_long(argc, argv, short_opt, long_opt, NULL)) != -1) { switch(c) { case -1: /* no more arguments */ case 0: /* long options toggles */ break; case 'f': printf("you entered \"%s\"\n", optarg); break; case 'h': printf("Usage: %s [OPTIONS]\n", argv[0]); printf(" -f file file\n"); printf(" -h, --help print this help and exit\n"); printf("\n"); return(0); case ':': case '?': fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return(-2); default: fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); return(-2); }; }; return(0); }