Boost库中默认自带了一个功能强大的命令行参数解析器,以往我都是自己实现参数解析的,今天偶尔发现这个好东西,就来总结一下参数解析的基本用法,该库需要引入program_options.hpp头文件,即可使用了。

第一次尝试

#include <iostream>
#include <boost/program_options.hpp> // 定义命名空间
namespace opt = boost::program_options; int main(int argc, char const *argv[])
{
opt::options_description desc("Usage: 32位端口快速扫描器\n\n options: \n"); desc.add_options()
("Address,a", opt::value<std::string>()->default_value("127.0.0.1"), "输入一个IP地址"),
("StartPort,s", opt::value<int>()->default_value(1024), "传入扫描起始端口"),
("EndPort,e", opt::value<int>()->default_value(65535), "传入扫描结束端口"),
("Help,h", "弹出帮助菜单"); // 解析参数将值传递给virtual_map
opt::variables_map virtual_map; try
{
opt::store(opt::parse_command_line(argc, argv, desc), virtual_map);
}
catch (...)
{
std::cout << "error \n";
return 0;
} // 参数解析完毕,处理
if (virtual_map.count("Help"))
{
printf("帮助");
}
if (virtual_map.count("Address"))
{
std::cout << "找到" << virtual_map["Address"].as<std::string>() << std::endl;
}
if (virtual_map.empty())
{
std::cout << "no options\n";
}
return 0;
}

第二次尝试

#include <iostream>
#include <vector>
#include <string>
#include <boost/program_options.hpp> namespace opt = boost::program_options; int main(int argc, char const *argv[])
{
int start_port = 1024, end_port = 65535;
std::vector<std::string> address; opt::options_description opt("\nUsage: 32位端口快速扫描器 Ver:1.0 \n\n options: \n");
opt.add_options()
("address,a", opt::value<std::vector<std::string> >()->multitoken(), "指定地址")
("start_port,s", opt::value<int>(&start_port)->default_value(1024), "开始端口")
("end_port,e", opt::value<int>(&end_port)->default_value(65535), "结束端口")
("help", "帮助菜单"); opt::variables_map vm;
try
{
opt::store(parse_command_line(argc, argv, opt), vm);
}
catch (...){
std::cout << "command error!\n";
return 0;
} opt::notify(vm);
if (vm.count("help"))
{
std::cout << opt << std::endl;
return 0;
}
if (vm.count("address") && vm.count("start_port") && vm.count("end_port"))
{
//遍历选项值
for (auto& str : vm["address"].as<std::vector<std::string> >())
std::cout << str << " ";
int x = vm["start_port"].as<int>();
std::cout << x << std::endl;
}
return 0;
}

最终版

#include <iostream>
#include <boost/program_options.hpp> namespace opt = boost::program_options; int main(int argc, char const *argv[])
{
opt::options_description des_cmd("\n Usage: 32位端口快速扫描器 Ver:1.0 \n\n Options: \n");
des_cmd.add_options()
("address,a", opt::value<std::string>()->default_value("127.0.0.1"), "指定地址")
("start_port,s", opt::value<int>()->default_value(1024), "开始端口")
("end_port,e", opt::value<int>()->default_value(65535), "结束端口")
("help,h", "帮助菜单"); opt::variables_map virtual_map;
try
{
opt::store(opt::parse_command_line(argc, argv, des_cmd), virtual_map);
}
catch (...){ return 0; } // 定义消息
opt::notify(virtual_map); // 无参数直接返回
if (virtual_map.empty())
{
return 0;
}
else if (virtual_map.count("help") || virtual_map.count("h"))
{
std::cout << des_cmd << std::endl;
return 0;
}
else if (virtual_map.count("address") && virtual_map.count("start_port") && virtual_map.count("end_port"))
{
std::cout << "Addr = " << virtual_map["address"].as<std::string>() << std::endl;
std::cout << "StartPort = " << virtual_map["start_port"].as<int>() << std::endl;
std::cout << "EndPort = " << virtual_map["end_port"].as<int>() << std::endl;
}
else
{
std::cout << "option error" << std::endl;
}
return 0;
}

命令行下使用help输出帮助菜单,当传入三个参数时,即可解析到第二个判断上,执行相应的函数即可。

C++ Boost库 实现命令行解析的更多相关文章

  1. 【C++】cmdline——轻量级的C++命令行解析库

    1.说明 cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件. 2.代码 20171210_命令行进行解析.cpp // 20171210_命令行进行解析. ...

  2. 【开源】libserial_parse_text:命令行解析的基础库

    借助五一假期,写了一个命令行解析的基础库,一般可用于串口命令解析.TCP命令解析等等. 具有以下几种特点: 不涉及到具体硬件, 纯软件协议,与具体硬件分离. 支持不定长命令行,逐个字符解码,可以支持不 ...

  3. Python命令行解析argparse常用语法使用简介

    查看原文:http://www.sijitao.net/2000.html python中的命令行解析最简单最原始的方法是使用sys.argv来实现,更高级的可以使用argparse这个模块.argp ...

  4. 使用命令行解析php文件

    使用命令行解析php文件,这样可以调用Log4PHP库中的一些demo,因为默认的输出使用命令行作为输出. 建一个bat文件: echo 以下是使用命令行解析php文件 C:\xampp\php\ph ...

  5. 『Argparse』命令行解析

    一.基本用法 Python标准库推荐使用的命令行解析模块argparse 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的optparse.因为argparse是 ...

  6. Python 命令行解析工具 Argparse介绍

    最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具. 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题 ...

  7. 2019-9-2-C#命令行解析工具

    title author date CreateTime categories C#命令行解析工具 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23: ...

  8. Go语言 命令行解析(一)

    命令行启动服务的方式,在后端使用非常广泛,如果有写过C语言的同学相信不难理解这一点!在C语言中,我们可以根据argc和argv来获取和解析命令行的参数,从而通过不同的参数调取不同的方法,同时也可以用U ...

  9. python模块----optparse模块、argparse模块 (命令行解析模块)

    简介 optparse module---自版本3.2以来已弃用:optparse模块已弃用,将不再进一步开发:将继续使用argparse模块进行开发.optparse使用一种更具声明性的命令行解析方 ...

  10. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

随机推荐

  1. [JAVA基础]后端原理

    后端原理 [[网站架构]5分钟了解后端工作原理.为什么Tomcat长时间运行会崩溃?高并发线程池怎么设置?] https://www.bilibili.com/video/BV1PB4y11795/? ...

  2. CMake + Protobuf 自动生成 cpp 文件(pb.h, pb.cc)

    [Protoc]VS2019 (VS平台) 使用 CMake 编译安装.使用 Protobuf 库 本文介绍在 macOS 系统下 cmake 和 protobuf 一起使用的一种方式--使用 cma ...

  3. 5、SpringBoot连接数据库引入mybatis

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  4. FrameWork使用TraeFik连接Grpc的坑

    背景介绍:因为公司最近使用TraeFik来代替nginx做代理服务器.导致一些老项目访问Grpc的时候直接Status(StatusCode=Unavailable, Detail="fai ...

  5. vue中form组件中上传el-upload(单、多附件上传,以及上传回显以及编辑不出现等问题)

    https://blog.csdn.net/weixin_46565787/article/details/121934075?spm=1001.2101.3001.6650.2&utm_me ...

  6. 软件开发常说的CI/CD是什么

    本文翻译自国外论坛 medium,原文地址:本文翻译自国外论坛 medium,原文地址:https://medium.com/gitconnected/basics-of-ci-cd-a98340c6 ...

  7. java项目实践-请求转发以及重定向-day18

    目录 1. 中文乱码问题 2. 请求的转发servlet 3. 登录后的重定向 4 总结 1. 中文乱码问题 创建一个工程secondweb 添加jar包依赖 new servlet web.xml添 ...

  8. Linux中使用Docker容器安装mysql,无法直接使用mysql命令?

    1.问题 如果你在 Docker 容器中运行 MySQL,你不能在宿主主机上使用 mysql --version 命令来检查 MySQL 版本,因为 MySQL 客户端工具在宿主主机上未安装. 2.解 ...

  9. [转帖]OS、PFS、DFS 有啥区别?一文搞懂 6 大临床试验终点

    https://oncol.dxy.cn/article/670607 说到肿瘤临床研究,就不得不说临床试验终点(End Point),比如大家熟知的 OS.PFS.ORR 还有 DFS.TTP.TT ...

  10. [转帖]OceanBase 4.2.1 LTS 发版 | 一体化数据库首个长期支持版本

    2013.11.20 https://open.oceanbase.com/blog/7746655008?_gl=1*1qv10rf*_ga*Nzk3MjIxOTk0LjE3MDI2MTAxMzk. ...