在C中使用默认值和范围约束解析命令选项
我需要用C语言解析命令行参数。我的参数基本上是 具有默认值和范围约束的int或float 我已经开始实施类似这样的东西:在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
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低很多的语言。