建议 cmdline,代码风格是比较优美的,而且操作简单,readme 一读就会用。另外还是 head-only 库,不需要额外链接,配置简单。

另一个答主说的 gflags 也比较著名,个人认为学习成本略高。不过毕竟是 Google 家的,专业性没的说。

至于自己切分成 vector& 的方案就不建议用了,自己在业务代码里做一堆字元解析和判断够乱的。


cxxopts


google gflag


不太理解你说的「现多个参数连在一起使用」是什么意思,权且贴一个我的库吧,但愿能有帮助。如果不行的话,你可以再详细描述一下,然后github上提issues。

jingweizhanghuai/Morn?

github.com图标

介面

char *mStringArgument(int argc,char **argv,const char *flag);

argc、argv就是main函数传入的参数,argc是参数个数,argv是参数内容(从argv[1]开始)。

flag是要寻找的参数标志,这里的标志必须以字元「-」打头,flag可以是一个字元,也可以是多个字元。

返回值就是找到的命令参数,它是字元串格式,通常,如果参数是数值的话,还需要和atoiatofssanf等函数一起使用。

如果没有找到,返回值是NULL。

例如:

int main(int argc,char **argv)
{
char *para = mStringArgument(argc,argv,"a");
if(para!=NULL) printf("para is %s
",para);
else printf("no para
");
}

以上面的程序为例,可见mStringArgument支持以下形式的参数:

$ test.exe -a12345
para is 12345
?
$ test.exe -a 12345
para is 12345
?
$ test.exe -a=12345
para is 12345
?
$ test.exe -a=12345 -b=6789
para is 12345
?
$ test.exe -a
para is ?

也即:以下三种形式的参数都是合法的,且三种方式等价:-a12345-a 12345-a=12345

对于最后一种,虽有参数,但未指定值的情况,将返回一个字元串,其值为「?」。

对于以下两种情况:

$ test.exe
no para
?
$ test.exe -b=6789
no para

即①没有参数或②虽有参数但是与给定的标志不匹配(参数为b,指定为a),其返回值都为NULL。

对于以下情况,应在程序设计时避免出现

$ test.exe -ab=12345
para is b=12345

或许开发者的本意是参数ab的值为12345,但是对于参数解析函数来说,不能区分①参数为ab,值为12345,②参数为a,值为b=12345,这两种情况。因此应避免使用,否则将可能出错。

对于多个参数有相同的标志位的,mStringArgument将循环读取各个参数。

例如:

int main(int argc,char **argv)
{
char *para = mStringArgument(argc,argv,"a");
char *para0=para;
do{
if(para!=NULL) printf("para is %s
",para);
else {printf("no para
");break;}
para = mStringArgument(argc,argv,"a");
}while(para!=para0);
}

运行以上程序,会得到:

$ test.exe -a=12 34 5
para is 12
para is 34
para is 5
?
$ test.exe -a12 -a34 -a5
para is 12
para is 34
para is 5
?
$ test.exe -a12 -a=34 -a:5
para is 12
para is 34
para is 5

$ test.exe -a12 34 -b 67 89 -a5
para is 12
para is 34
para is 5


怎么没人提 boost::program_options

可以解析命令行和配置文件,用的人挺多的啊。


cli11


为何多个参数不可一起用呢?先声明变数,getopt解析并给变数赋值,最后判断几个变数的值组合使用。


Qt QCommandLineParser

https://doc.qt.io/qt-5/qcommandlineparser.html?

doc.qt.io


clara


*9;/。;


???这你自己切分一下,放到个vector里不就得了


推荐阅读:
相关文章