Программирование на C с помощью getopt(): предоставление критериев флагов командной строки
Я начинаю учить себя C. Я столкнулся с несколькими ударами тут и там, но сейчас я озадачен getOpt()
, Главное, что доставляет мне неприятности, это когда я пытаюсь сделать некоторые флаги зависимыми от других флагов. Например, я хочу, чтобы они работали:
./myfile -a -b -c blue
Но ни один из других вариантов не работает без -a. таким образом ./myfile -b -c purple
будет недействительным. Возможно ли для getopt обрабатывать такие "зависимые от флага" критерии? Как бы я поступил так? Во-вторых, допустим, что независимо от того, какие флаги переданы, наряду с этим должен быть цвет.
Так ./myfile -a -b green
а также ./myfile red
оба действительны. Я понимаю, что все это находится в параметре параметров getOpt() (который в настоящее время настроен так, чтобы выглядеть примерно так: "abc"), но как бы я сделал один параметр обязательным для каждого экземпляра, не делая "a:b:c: msgstr "поскольку это не будет включать обязательный цвет, если флаги не переданы.
1 ответ
Вот пример (из справочной страницы) getopt
:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main (int argc, char *argv[])
{
int flags, opt;
int nsecs, tfnd;
nsecs = 0;
tfnd = 0;
flags = 0;
while ((opt = getopt (argc, argv, "nt:")) != -1)
{
switch (opt)
{
case 'n':
flags = 1;
break;
case 't':
nsecs = atoi (optarg);
tfnd = 1;
break;
default: /* '?' */
fprintf (stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]);
exit (EXIT_FAILURE);
}
}
printf ("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);
if (optind >= argc)
{
fprintf (stderr, "Expected argument after options\n");
exit (EXIT_FAILURE);
}
printf ("name argument = %s\n", argv[optind]);
/* Other code omitted */
exit (EXIT_SUCCESS);
}
Обратите внимание, что вам нужно добавить несколько объявлений и main()
функция, чтобы заставить это работать.
Вы можете увидеть пример n
выше флаг, и работает как ваш b
вариант. t
Опция выше принимает параметр и работает как ваш c
вариант. Если вы хотите иметь a
вариант, который также является флагом, вы бы сделали getopt
параметр "abf:"
(т.е. добавить a
без двоеточия), и строфа к switch
как это:
case 'a':
aflag = 1;
break;
имея первый сет aflag
на 0. В конце вы бы проверили на недопустимое условие, когда другие параметры были переданы без aflag
быть установленным
В общем, это будет выглядеть так:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main (int argc, char *argv[])
{
int flags, opt;
int nsecs, tfnd;
int aflag;
nsecs = 0;
tfnd = 0;
flags = 0;
aflag = 0;
while ((opt = getopt (argc, argv, "ant:")) != -1)
{
switch (opt)
{
case 'a':
aflag = 1;
break;
case 'n':
flags = 1;
break;
case 't':
nsecs = atoi (optarg);
tfnd = 1;
break;
default: /* '?' */
fprintf (stderr, "Usage: %s [-t nsecs] [-n] name\n", argv[0]);
exit (EXIT_FAILURE);
}
}
printf ("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);
if (optind >= argc)
{
fprintf (stderr, "Expected argument after options\n");
exit (EXIT_FAILURE);
}
if (!aflag && (flags || tfnd))
{
fprintf (stderr, "Must specify a flag to use n or t flag\n");
exit (EXIT_FAILURE);
}
printf ("name argument = %s\n", argv[optind]);
/* Other code omitted */
exit (EXIT_SUCCESS);
}