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. Centos7 cmake版本升级(v2.8.12.2->v3.16.6)

    1. 查看当前cmake版本 [root@localhost ~]# cmake -version cmake version 2.8.12.2 2. 进行卸载 [root@localhost ~]# ...

  2. SpringBoot 学习笔记:运维篇

    SpringBoot程序的打包和运行 开发部门使用Git.SVN等版本控制工具上传工程到版本服务器 服务器使用版本控制工具下载工程 服务器上使用Maven工具在当前真机环境下重新构建项目 启动服务 程 ...

  3. ACM:快读读入技巧

    快速读入:当数据输入较大时,比scanf快 inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9') ...

  4. 安装Amos结构方程模型分析软件的方法

      本文介绍IBM SPSS Amos软件的安装方法.   Amos是IBM公司旗下一款强大的结构方程建模软件.其捆绑在高级版的SPSS Statistics软件中,但其它版本的SPSS Statis ...

  5. 如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件

    ​ 某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下, "Dll加固混淆针对Unity游戏,对 ...

  6. Serverless 时代开启,云计算进入业务创新主战场

    作者 | 于洪涛 "我们希望让用户做得更少而收获更多,通过 Serverless 化,让企业使用云服务像用电一样简单." Serverless 化正在成为全新的软件研发范式,阿里云 ...

  7. echart相关

    https://www.bilibili.com/video/BV1bh41197p8?p=21&spm_id_from=pageDriver

  8. freeswitch的ACL规则

    概述 freeswitch是一款好用的VOIP开源软交换平台. VOIP公共网络中的安全问题是最重要的问题,我们必须对网络端口的访问权限做出限制. ACL全称Access Control List,意 ...

  9. Linux 文件目录配置及命令总结

    前言 在Linux中,一切皆文件,而每一个文件和目录都是从根目录开始的 Linux文件目录的作用 /bin目录:用来存放二进制可执行命令的目录,用户常用的命令都存在该目录下. /sbin目录:用来存放 ...

  10. 理解 Kubernetes volume 和 共享存储

    1. Kubernetes volume 文章 介绍了 Docker volume.与 docker volume 类似的,在 kubernetes 中存在 Pod 级别的 volume,Pod 的 ...