Программирование на 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);
}
Другие вопросы по тегам