C++基于Boost库实现命令行解析

第一次尝试

#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输出帮助菜单,当传入三个参数时,即可解析到第二个判断上,执行相应的函数即可。

文章出处:https://www.cnblogs.com/lyshark

以上就是C++基于Boost库实现命令行解析的详细内容,更多关于C++ Boost库实现命令行解析的资料请关注我们其它相关文章!

(0)

相关推荐

  • C++和Java命令行绘制心形图案

    心形线 心形线,是一个圆上的固定一点在它绕着与其相切且半径相同的另外一个圆周滚动时所形成的轨迹,因其形状像心形而得名. 心脏线亦为蚶线的一种.在曼德博集合正中间的图形便是一个心脏线.心脏线的英文名称"Cardioid"是 de Castillon 在1741年的<Philosophical Transactions of the Royal Society>发表的:意为"像心脏的". 极坐标方程 水平方向: ρ=a(1-cosθ) 或 ρ=a(1+cos

  • C++ 设置控制台(命令行)窗口 光标位置,及前背景颜色

    核心代码 #include "stdafx.h" #include <stdio.h> #include <windows.h> /* #define FOREGROUND_BLUE 0x0001 // text color contains blue. #define FOREGROUND_GREEN 0x0002 // text color contains green. #define FOREGROUND_RED 0x0004 // text color

  • 用C++实现一个命令行进度条的示例代码

    缘起 最近做遥感影像融合的GWPCA方法,在带宽比较大的时候速度太慢了,需要有个进度条指示一下,然后我去找进度条的库,发现github上面的C/C++的相应的库似乎没有能在VS下跑的,自己花了点时间写了一个. 效果 实现 大概需要考虑这样几个要素 已完成的百分比 执行速度 已执行的时间 剩余时间 另外进度条的引入不能破坏已有的执行结构,最好和Python的tqdm库类似,通过 start , update 等函数来完成整个进度条,因此对于C语言来说,需要一个定时器,定期将进度条进行重绘(不可能更

  • 贪吃蛇游戏C++命令行版实例代码

    本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏.分享给大家供大家参考.具体实现方法如下: 众所周知,贪吃蛇游戏是经典的计算机游戏. 游戏描述如下: 1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格. 2. 贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时: ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时: ③玩家的键盘输入不是方向键时: 命令行显示"Game Over!"并且退出游戏. 3. 贪吃蛇活动的区域内每次随机产生一颗&quo

  • C++命令行解析包gflags的使用教程

    前言 gflags 是 Google 提供的一个命令行参数处理的开源库,目前已经独立开源,比传统的 getopt() 功能更加强大,可以将不同的参数定义分布到各个源码文件中,不需要集中管理. 提供了 C++ 和 Python 两个版本,这里仅详细介绍 C++ 版本的使用方式. 简介 配置参数分开还是集中管理没有严格的约束,关键要看项目里的统一规范,只是,gflags 可以支持这两种方式,允许用户更加灵活的使用. 当将参数分布到各个源码文件中时,如果定义了相同的参数,那么在编译的时候会直接报错.

  • C++基于Boost库实现命令行解析

    第一次尝试 #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_op

  • 详解Python命令行解析工具Argparse

    最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具. 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题,尤其是vc++中尤其繁琐. 现在用python来实现命令行,核心计算模块可以用c自己写扩展库,效果挺好. 学习了argparse,在官方文档中找到一篇toturial,简单翻译了下. http://docs.python.org/2/howto/argparse.html#id1 Argparse

  • Python 命令行解析工具 argparse基本用法

    在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse, getopt, argparse.这里面功能最强大的莫过于 argparse,下面就来看看它用法. import argparse # 使用 argparse 分为以下几步 # 1. 创建命令行解析器对象 parse = argparse.ArgumentParser( description="这是命令行解析器" ) # 2.给解析器添加命令行参

  • Python命令行解析模块详解

    本文研究的主要是Python命令行解析模块的相关内容,具体如下. Python命令行常见的解析器有两种,一是getopt模块,二是argparse模块.下面就解读下这两种解析器. getopt模块 这个模块可以帮助脚本解析命令行参数,一般是sys.argv[1:].它遵循着Unix的getopt()函数相同的约定(用-/--指定命令参数).这个模块提供两个函数(getopt.getopt()/getopt.gnu_getopt())和一个参数异常(getopt.GetoptError). 这里重

  • python命令行解析之parse_known_args()函数和parse_args()使用区别介绍

    在python中,命令行解析的很好用, 首先导入命令行解析模块 import argparse import sys 然后创建对象 parse=argparse.ArgumentParser() 然后增加命令行 parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate") parse.add_argument("--max_steps&

  • 基于vue cli 通过命令行传参实现多环境配置

    大多数项目都有生产环境和开发环境,一般情况下应该够了,但是有时候还需要sit,uat,本地等环境,这时候假如要通过注释的方式切换环境就相当麻烦了. 如果可以像下面这样切换环境就方便了 npm run serve //默认本地开发环境 npm run serve -sit //本地开发中使用sit环境 npm run serve -uat //本地开发中使用uat环境 npm run build //默认打包后使用生产环境 npm run build -local //打包后使用本地环境 npm

  • Python命令行解析器argparse详解

    目录 第1章 argparse简介 1.1 解析 1.2 argparse定义三步骤 1.3  代码示例 第2章 参数详解 2.1 创建一个命令行解析器对象:ArgumentParser() 2.2 为命令行添加参数: add_argument() 方法 2.3 解析命令行的参数:parse_args() 2.4 命令行参数的输入 2.5 命令行参数的使用 总结 第1章 argparse简介 1.1 解析 argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,argp

  • .NET命令行解析器示例程序(命令行选项功能)

    示例需求 拷贝文件,如:CopyFiles -s "E:\Framework\Tenoner - 副本 (2)" -p "*.csproj" -t "E:\Framework\Tenoner - 副本 (2)\Bak",可以支持:深度拷贝.拷贝符合指定模式的文件.是否覆盖等选项. 使用 CommandLineParserCommandLineParser 是一个轻量级的工具,使用非常简答,官方也有教程. 选项类 复制代码 代码如下: using

  • Python 中使用 argparse 解析命令行参数

    目录 1.Python 中的参数解析 2.类型 3.子命令 4.程序架构 使用 argparse 模块为应用程序设置命令行选项. 有一些第三方库用于命令行解析,但标准库 argparse 与之相比也毫不逊色. 无需添加很多依赖,你就可以编写带有实用参数解析功能的漂亮命令行工具. 1.Python 中的参数解析 使用 argparse 解析命令行参数时,第一步是配置一个 ArgumentParser 对象.这通常在全局模块内完成,因为单单_配置_一个解析器没有副作用. import argpars

随机推荐