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/) ...
随机推荐
- Mysql--编译安装5.6版本
1 下载编译工具 yum -y install cmake gcc gcc-c++ ncurses-devel autoconf 2 创建用户 目录 useradd -s /sbin/nologin ...
- CO01生产订单屏幕增强
一.生产订单客户屏幕新增字段 二.生产订单抬头AUFK表的CI_AUFK中新增屏幕字段 三.CMOD 增强分配PPCO0012 修改0100屏幕,新增对应字段,其中生产订单类型设置为下拉框 EXIT_ ...
- javascript yield
代码: function delay(time) { return new Promise(function (resolve, reject) { setTimeout(() => { res ...
- 【Vue CLI】手把手教你撸插件
本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/Rl8XLUX7isjXNUmbw0-wow作者:ZhuPing 现如今 Vue 作为主流的前端框 ...
- KCD技术分享:以SBOM为基础的云原生应用安全治理
随着越来越多的企业和组织将他们的应用迁移到云上,云原生技术的应用部署和管理正在变得更加灵活和高效,但也相应地引入了一些新的安全风险.2023年4月15日,由云原生计算基金会(CNCF)发起,全球各国当 ...
- Vue tinymce富文本编辑器整合
最近再弄一个后台管理系统,挑选了不少的编辑器,最终选择了tinymce,UI精美,功能模块多,可按需加载配置 vue cli 3 + tinymce5.0版本整合参考:https://liubing. ...
- java - 字符串转数字
Integer.valueOf("str").intValue(): Integer.valueOf("123").intValue():
- tomcat 一闪而过 ( 解决方案 )
配置JAVA_HOME,注意变量值是jdk的主目录,不是bin目录,并且不要加分号
- JMS微服务开发示例(四)把配置文件appsettings.json 部署在网关,共享给其他相同的微服务
通常,多个相同的微服务器,它们的appsettings.json配置文件的内容都是一样的,如果,每次修改配置文件,都要逐个替换,那就太繁琐了,我们可以利用网关的文件共享功能,实现配置文件的统一更新. ...
- Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
概述 在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们.举个例子,我们可以实现特殊方法__len__(),然后通过 ...