命令行参数解析库
1 背景
在c++后台算法开发中,免不了需要在控制台进行程序运行。这时就需要在main函数里写一个对参数解析的程序。网上虽然有一些开源解析框架,但是都不满足自己需求,为了满足大部分使用,这里简单写了一个入口参数解析框架。这个框架满足如下条件:
①当入口参数设置错误时,程序不崩溃。
②能以一个友好的界面提示输入参数信息。
③输入参数错误时,能直接返回帮助信息。
④支持按顺序读取参数。
⑤支持按key读取参数。
⑥按key读取参数时可以乱序。
⑦支持按【可选】或者【必须】设置参数。
⑧支持字符串以及整形和浮点数输入。
2 代码
代码: LGLog仓库
使用:
(1) 包含ParseParam.h头文件
(2) 定义 vecParseParam_t 结构
(3) 调用parseParam函数解析参数
(4) 解析失败使用printCmd打印帮助信息
3 带key例子
3.1 源码
下面是带key例子,即[-i]、[-o]、[-l]、[-n]这种方式初始化参数
#include "DumpLog.h"
#include "ParseParam.h"
int main(int argNum, char **args)
{
using namespace parse;
//1.定义需要解析的参数,解析的结果将赋值到这些参数上
int32_t num(100);
double len(66.88);
std::string inDir(""), outDir("");
//2. 定义参数key以及名称
vecParseParam_t params
{
{"i" , "inDir" , true , ParamType_E::String_E, &inDir , "输入目录"},
{"o" , "outDir", true , ParamType_E::String_E, &outDir, "输出目录"},
{"l" , "length", false, ParamType_E::Double_E, &len , "长度参数"},
{"n" , "num" , false, ParamType_E::Int32_E , &num , "总次数参数"},
};
//3.
if (!parseParam(args, argNum, params))
{
printCmd(params, "命令解析测试带key例子");
return 0;
}
//4. 打印所有值。接下来就可以直接使用inDir, outDir, len, num
LogInfo("输入参数如下:\ninDir = {}\noutDir = {}\n len = {}\n num = {}", inDir, outDir, len, num);
return 1;
}
3.2 帮助信息
如果直接执行程序,或者参数输入错误,会提示如下帮助信息
—————————————————————————————————————————————————————
功能: 命令解析测试例子
—————————————————————————————————————————————————————
./testParseParam -i inDir -o outDir [-l length] [-n num]
—————————————————————————————————————————————————————
inDir : -i, string, [必须], 输入目录
outDir: -o, string, [必须], 输出目录
length: -l, double, [可选], 长度参数
num : -n, int32 , [可选], 总次数参数
—————————————————————————————————————————————————————
功能: 命令解析测试例子
—————————————————————————————————————————————————————
./testParseParam -i inDir -o outDir [-l length] [-n num]
—————————————————————————————————————————————————————
inDir : -i, string, [必须], 输入目录
outDir: -o, string, [必须], 输出目录
length: -l, double, [可选], 长度参数
num : -n, int32 , [可选], 总次数参数
—————————————————————————————————————————————————————
3.3 输入
这里输入如下信息
./testParseParam -i ./data/input -o ./data/outDir -n 66
然后程序将输出如下信息
[2026-01-06 21:38:00.310][Info][testParseParam.cpp:35] 输入参数如下:
inDir = ./data/input
outDir = ./data/outDir
len = 66.88
num = 66
inDir = ./data/input
outDir = ./data/outDir
len = 66.88
num = 66
4 不带key例子
4.1 源码
下面是不带key例子,即按顺序初始化参数,即第几个参数就赋值给第几个变量
#include "DumpLog.h"
#include "ParseParam.h"
int main(int argNum, char **args)
{
using namespace parse;
//1.定义需要解析的参数,解析的结果将赋值到这些参数上
int32_t num(100);
double len(66.88);
std::string inDir(""), outDir("");
//2.按顺序接收inDir, outDir, len, num这4个参数,其中前两个为必须设置参数,后两个为非必须设置参数
vecParseParam_t params
{
{"inDir" , true , ParamType_E::String_E, &inDir , "输入目录"},
{"outDir", true , ParamType_E::String_E, &outDir, "输出目录"},
{"length", false, ParamType_E::Double_E, &len , "长度参数"},
{"num" , false, ParamType_E::Int32_E , &num , "总次数参数"},
};
//3.
if (!parseParam(args, argNum, params))
{
printCmd(params, "命令解析测试不带key例子");
return 0;
}
//4. 打印所有值。接下来就可以直接使用inDir, outDir, len, num
LogInfo("输入参数如下:\ninDir = {}\noutDir = {}\n len = {}\n num = {}", inDir, outDir, len, num);
return 1;
}
4.2 帮助信息
如果直接执行程序,或者参数输入错误,会提示如下帮助信息
—————————————————————————————————————————————————————
功能: 命令解析测试不带key例子
—————————————————————————————————————————————————————
./testParseParam2 inDir outDir [length] [num]
—————————————————————————————————————————————————————
inDir , string, [必须], 输入目录
outDir, string, [必须], 输出目录
length, double, [可选], 长度参数
num , int32 , [可选], 总次数参数
—————————————————————————————————————————————————————
功能: 命令解析测试不带key例子
—————————————————————————————————————————————————————
./testParseParam2 inDir outDir [length] [num]
—————————————————————————————————————————————————————
inDir , string, [必须], 输入目录
outDir, string, [必须], 输出目录
length, double, [可选], 长度参数
num , int32 , [可选], 总次数参数
—————————————————————————————————————————————————————
4.3 输入
这里输入如下信息
./testParseParam2 ./data/input ./data/outDir 13.8 66
然后程序将输出如下信息
[2026-01-06 21:38:00.310][Info][testParseParam.cpp:35] 输入参数如下:
inDir = ./data/input
outDir = ./data/outDir
len = 13.8
num = 66
inDir = ./data/input
outDir = ./data/outDir
len = 13.8
num = 66