C++ Boost库 实现命令行解析
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库 实现命令行解析的更多相关文章
- 【C++】cmdline——轻量级的C++命令行解析库
1.说明 cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件. 2.代码 20171210_命令行进行解析.cpp // 20171210_命令行进行解析. ...
- 【开源】libserial_parse_text:命令行解析的基础库
借助五一假期,写了一个命令行解析的基础库,一般可用于串口命令解析.TCP命令解析等等. 具有以下几种特点: 不涉及到具体硬件, 纯软件协议,与具体硬件分离. 支持不定长命令行,逐个字符解码,可以支持不 ...
- Python命令行解析argparse常用语法使用简介
查看原文:http://www.sijitao.net/2000.html python中的命令行解析最简单最原始的方法是使用sys.argv来实现,更高级的可以使用argparse这个模块.argp ...
- 使用命令行解析php文件
使用命令行解析php文件,这样可以调用Log4PHP库中的一些demo,因为默认的输出使用命令行作为输出. 建一个bat文件: echo 以下是使用命令行解析php文件 C:\xampp\php\ph ...
- 『Argparse』命令行解析
一.基本用法 Python标准库推荐使用的命令行解析模块argparse 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的optparse.因为argparse是 ...
- Python 命令行解析工具 Argparse介绍
最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具. 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题 ...
- 2019-9-2-C#命令行解析工具
title author date CreateTime categories C#命令行解析工具 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 17:23: ...
- Go语言 命令行解析(一)
命令行启动服务的方式,在后端使用非常广泛,如果有写过C语言的同学相信不难理解这一点!在C语言中,我们可以根据argc和argv来获取和解析命令行的参数,从而通过不同的参数调取不同的方法,同时也可以用U ...
- python模块----optparse模块、argparse模块 (命令行解析模块)
简介 optparse module---自版本3.2以来已弃用:optparse模块已弃用,将不再进一步开发:将继续使用argparse模块进行开发.optparse使用一种更具声明性的命令行解析方 ...
- Noah的学习笔记之Python篇:命令行解析
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
随机推荐
- [JAVA基础]后端原理
后端原理 [[网站架构]5分钟了解后端工作原理.为什么Tomcat长时间运行会崩溃?高并发线程池怎么设置?] https://www.bilibili.com/video/BV1PB4y11795/? ...
- CMake + Protobuf 自动生成 cpp 文件(pb.h, pb.cc)
[Protoc]VS2019 (VS平台) 使用 CMake 编译安装.使用 Protobuf 库 本文介绍在 macOS 系统下 cmake 和 protobuf 一起使用的一种方式--使用 cma ...
- 5、SpringBoot连接数据库引入mybatis
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- FrameWork使用TraeFik连接Grpc的坑
背景介绍:因为公司最近使用TraeFik来代替nginx做代理服务器.导致一些老项目访问Grpc的时候直接Status(StatusCode=Unavailable, Detail="fai ...
- vue中form组件中上传el-upload(单、多附件上传,以及上传回显以及编辑不出现等问题)
https://blog.csdn.net/weixin_46565787/article/details/121934075?spm=1001.2101.3001.6650.2&utm_me ...
- 软件开发常说的CI/CD是什么
本文翻译自国外论坛 medium,原文地址:本文翻译自国外论坛 medium,原文地址:https://medium.com/gitconnected/basics-of-ci-cd-a98340c6 ...
- java项目实践-请求转发以及重定向-day18
目录 1. 中文乱码问题 2. 请求的转发servlet 3. 登录后的重定向 4 总结 1. 中文乱码问题 创建一个工程secondweb 添加jar包依赖 new servlet web.xml添 ...
- Linux中使用Docker容器安装mysql,无法直接使用mysql命令?
1.问题 如果你在 Docker 容器中运行 MySQL,你不能在宿主主机上使用 mysql --version 命令来检查 MySQL 版本,因为 MySQL 客户端工具在宿主主机上未安装. 2.解 ...
- [转帖]OS、PFS、DFS 有啥区别?一文搞懂 6 大临床试验终点
https://oncol.dxy.cn/article/670607 说到肿瘤临床研究,就不得不说临床试验终点(End Point),比如大家熟知的 OS.PFS.ORR 还有 DFS.TTP.TT ...
- [转帖]OceanBase 4.2.1 LTS 发版 | 一体化数据库首个长期支持版本
2013.11.20 https://open.oceanbase.com/blog/7746655008?_gl=1*1qv10rf*_ga*Nzk3MjIxOTk0LjE3MDI2MTAxMzk. ...