使用C中的默认值和范围约束解析命令选项

时间:2010-12-26 19:44:51

标签: c parsing getopt

我需要在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)

但我不想重新发明轮子!

我的目标是对范围约束进行错误检查,何时抛出错误 该选项不是可选的,未设置。并通常生成帮助消息 由usage()函数给出。

使用文本如下所示:

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

我已经开始使用getopt,但它对于我想做的事情来说太有限了,我觉得它仍然存在 要求我为这样一个简单的用例编写太多代码。

您会推荐哪些替代方案?

1 个答案:

答案 0 :(得分:0)

假设您正在编写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程序员,是吗?