Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用默认值和范围约束解析命令选项_C_Parsing_Getopt - Fatal编程技术网

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

在C中使用默认值和范围约束解析命令选项,c,parsing,getopt,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) --pct My super percentage option (defa

我需要用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)
--pct     My super percentage option (default : 50). Should be in [0, 100]
例如,我称之为:

float* pct;
option_float(pct, argc, argv, "pct", "My super percentage option", 50, 1,
    FALSE, 0, 100)
然而,我不想重新发明轮子

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

用法文本如下所示:

option_float(float* out, int argc, char* argv, char* name, description,
    float default_val, int is_optional, float min_value, float max_value)
--pct     My super percentage option (default : 50). Should be in [0, 100]
我从getopt开始,但它对于我想做的事情来说太有限了,我仍然感觉到它 对于这样一个简单的用例,我需要编写太多的代码


您会推荐什么替代方案?

假设您正在为Linux编码

尝试getopt_long(man 3 getopt_long)获得双短跑选项

另外,尝试将验证器设置为泛型函数,让getopt/getopt_长到解析和检查选项所需参数的困难部分

在任何情况下,如果您想使用定义的函数,那么示例调用将无法按定义工作

一个简化的例子:

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程序员,是吗?

浏览了一些选项(网站上可能还有其他问题,这是常见的需求)。我不知道一个能满足你所有的要求,但是
gengetopt
会减少你必须编写的代码量。遗憾的是,gengetopt是GPL,但gopt和glib似乎是不错的选择。我将探讨这两个选项。感谢这是一个关于getopt的漂亮而简单的设计,但对于我这样的Python程序员来说,仍然有点过于冗长;)我将按照上面的建议探索gopt和glib。感谢这就是C语言的游戏名称。它是一种比Python低很多的语言。