опция команды синтаксического анализа со значениями по умолчанию и ограничениями диапазона в C - PullRequest
1 голос
/ 26 декабря 2010

Мне нужно проанализировать аргументы командной строки в C. Мои аргументы в основном int или float со значениями по умолчанию и ограничениями диапазона.

Я начал реализовывать что-то похожее на это:

option_float(float* out, int argc, char* argv, char* name, description,
    float default_val, int is_optional, float min_value, float max_value)

, который я вызываю, например, с:

float* pct;
option_float(pct, argc, argv, "pct", "My super percentage option", 50, 1,
    FALSE, 0, 100)

Однако я не хочу изобретать велосипед!

Моя цель - проверить ошибки ограничений диапазона, броситьошибка, когда опция не является обязательной и не установлена.И сгенерируйте сообщение справки, обычно предоставляемое функцией use ().

Текст использования будет выглядеть так:

--pct     My super percentage option (default : 50). Should be in [0, 100]

Я начал с getopt, но он слишком ограничен для того, что яхочу сделать, и я чувствую, что мне все еще нужно писать слишком много кода для простого варианта использования, подобного этому.

Какие альтернативы вы бы порекомендовали?

1 Ответ

0 голосов
/ 27 декабря 2010

Если вы пишете код для Linux ...

Попробуйте getopt_long (man 3 getopt_long) для параметров двойной тире.

Кроме того, попробуйте сделать валидаторы общими функциями, иgetopt / getopt_long для сложной части синтаксического анализа и проверки необходимых аргументов для параметров.

В любом случае, если вы хотите использовать свои функции, как определено, ваш пример вызова не будет работать, как определено.

Упрощенный пример:

int main( int argc, char **argv )
{
  float pct = 0.0
  if( !GetArgs(argc, argv, &pct) )
    DoStuff(pct)
}

int GetArgs( int argc, char **argv, float *thePct )
{
  extern char *optarg;
  int  rc = 0;

  (*thePct) = 50.0  /* default val */

  while( (opt = getopt(argc, argv, "hp:")) != -1 )
  {
    switch( opt )
    {
      case  'p':
            (*thePct) = atof( optarg );
            break;

      case  'h':
            MyUsage();  /* Explain everything */
            rc = -1;
            break;
    }
  }

  if( !rc )
  {
    rc = ValidatePct( (*thePct),   /* value to check */
                      0.0,         /* low pct val */
                      100.0 );     /* hi pct val */

    /* Other validations here */

    if( !rc )
      MyUsage();
  }
}

Это разрешит вызов наподобие:

$ myprogram -p 45.0

Если вы придерживаетесь парсеров getopt и getopt_long, вы также можете создавать командные строки, которые принимают параметрыза ним следует N других аргументов, таких как grep, например:

grep -in -e "SomeRegex" file1, file2, ..., fileN

Из чистого любопытства вы не программист на PERL, не так ли?

...