命令行参数解析库

命令行参数解析库

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 , [可选], 总次数参数
—————————————————————————————————————————————————————

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

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 , [可选], 总次数参数
—————————————————————————————————————————————————————

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

发表回复

您的电子邮箱地址不会被公开。

蜀ICP备17029856号-1