我需要在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,但它对于我想做的事情来说太有限了,我觉得它仍然存在 要求我为这样一个简单的用例编写太多代码。
您会推荐哪些替代方案?
答案 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程序员,是吗?