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

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

第一次尝试

#include 
#include 

// 定义命名空间
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()->default_value("127.0.0.1"), "输入一个IP地址"),
		("StartPort,s", opt::value()->default_value(1024), "传入扫描起始端口"),
		("EndPort,e", opt::value()->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::endl;
	}
	if (virtual_map.empty())
	{
		std::cout << "no options\n";
	}
	return 0;
}

第二次尝试

#include   
#include   
#include 
#include   

namespace opt = boost::program_options;

int main(int argc, char const *argv[])
{
	int start_port = 1024, end_port = 65535;
	std::vector address;

	opt::options_description opt("\nUsage: 32位端口快速扫描器 Ver:1.0 \n\n options: \n");
	opt.add_options()
		("address,a", opt::value >()->multitoken(), "指定地址")
		("start_port,s", opt::value(&start_port)->default_value(1024), "开始端口")
		("end_port,e", opt::value(&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::cout << str << " ";
		int x = vm["start_port"].as();
		std::cout << x << std::endl;
	}
	return 0;
}

最终版

#include 
#include 

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()->default_value("127.0.0.1"), "指定地址")
		("start_port,s", opt::value()->default_value(1024), "开始端口")
		("end_port,e", opt::value()->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::endl;
		std::cout << "StartPort = " << virtual_map["start_port"].as() << std::endl;
		std::cout << "EndPort = " << virtual_map["end_port"].as() << std::endl;
	}
	else
	{
		std::cout << "option error" << std::endl;
	}
	return 0;
}

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

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

以上就是C++基于Boost库实现命令行解析的详细内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、系统和网络编程:ACE 除了ACE之外,还有很多系统和网络编程方面的程序。比如在线程方面,还有ZThread、boost::thread,如果放大到C/C++领域,还有APR,还有CII。在文件和目录操作方面,boost也有相应的组件,而在网络编程方面有socket++,还有boost::asio,未来的C ++0X中几乎肯定有一个网络编程和一个线程。然而目前看来,ACE仍然是进行系统和高性能网络编程的首选,其地位在一段时间内不会被撼动。它不但是一个实用的程序、框架集,还是一个典范的设计模式应用范例,非常值得学习。 2、GUI:Qt 传统上Qt被认为是可移植的GUI,但实际上Qt现在已经是一个比较完整的可移植应用程序框架了,其中包含了大量的工具,比如正则表达式、Web和 Socket类、2D和3D图形、XML解析、SQL类等,甚至还包括了一个完整的容器类,不过其王牌还是GUI。在目前的跨平台GUI框架中,Qt成熟度最高,已经被一些大公司应用在关键产品中。由于Trolltech对Qt采用的dual license模式,该产品既可以从开源社区获得支持,又能够赚取足够的商业利润,因此其前景也令人比较有信心。 Qt的主要技术特色是其元对象模型。Qt实际上使用的并不是标准的C++,而是标准C++的一个扩展。它通过元对象模型扩展,实现了著名的signal/slot机制,而这一机制也成为Qt的最大特色和优势。 与Qt类似的可移植GUI框架还有wxWidget、FOX等。 3、分布式对象中间件:ICE ICE是分布式对象中间件领域里的后起之秀,可以大致地将其视为“改进版”的CORBA。目前应用在一些大型项目当中,其中包括波音公司主持的下一代陆军作战系统。 ICE的一个特别价值是其代码的范例意义。由于ICE的出现较晚,开发者比较系统地应用了新的C++编程风格,所以成为了研读C++代码的良好目标。 4、正则表达式:boost::regex 正则表达式是编程工作中最强有力的工具之一。C++的正则表达式支持一直以来是一个软肋。大约在2001年左右,boost中出现了regex,初步解决了这个问题。但是最初的regex无论在效率上还是可靠性方面都有一些问题,后来经过一次大规模的翻修之后,达到了比较完善的程度。 其他可以选择的替代品还有C语言的pcre,Qt中的QRegExp类等。 5、矩阵计算:MTL 自1995年以来,C++在科学计算领域当中取得了巨大的突破。这主要归功于template技术的高级应用,使得C++在科学计算的性能方面取得了巨大的进步,一大批优秀的C++科学计算涌现出来。比如Blitz++、POOMA、MTL、Boost::uBLAS。而这其中,MTL就功能丰富程度、性能、开发支持和成熟程度来讲,是比较突出的一个,因此可以优先考虑。值得一提的是,2002年,MTL与后来被Intel收购的KAI C++配合,曾经在性能评测中击败了FORTRAN。 6、XML、TinyXml C++的XML相关不少,但是大部分其实都是C,使用起来自然不那么轻便。其中基于DOM的有TinyXml,基于SAX的当然是Xerces。前者小巧快捷,便于使用,适合做数据交换。后者则是全功能的XML解析器。 7、内存管理:boost::smart_ptr,Hans-Boehm GC C/C++的内存管理是一个永恒的话题。一般来说,C++的开发者倾向于自己管理内存。然而,出乎很多C++开发者意料的是,近期C++的一些领袖人物已经公开宣称,如果不配备自动内存管理机制,用C++编写安全可靠的大型程序是非常困难的。而Bjarne Stroustrup也曾对中国开发者建议,如果没有特别的理由,应该在大型项目中使用自动内存管理工具。因此,今天的C++开发者应当积极地学习和应用自动内存管理设施。 说到自动内存管理,比较轻量级的做法是boost::smart_ptr,而激进的做法是引入完整的GC机制。目前开源而又比较可靠的GC中,Hans- Boehm GC无疑是最受信赖的。作为一个保守的GC,Hans-Boehm GC在性能和功能方面都算是卓越。特别是,使用这个**,你仍然可以*elete、free来自己管理内存,对于我们编程习惯的冲击比较小。 8、配置管理:Lua 随着软件系统越来越复杂,对软件的可配置型提出了越来越高的要求。传统上只要通过命令行参数来配置的系统,现在可能需要越来越多的方式和机制。目前越来越受欢迎、并且得到越来越多证实的做法,是将Lua嵌入到C/C++程序中,而用Lua程序作为配置脚本。这种做法的优势是,Lua语言强大灵活,可以适应复杂的配置要求。同时,Lua便于嵌入C/C++程序,而且编译执行速度非常快,可以说是目前解决C/C++程序配置管理问题的一个出色方案。 9、密码及安全:OpenSSL 安全是今天进行C/C++编程无法回避和必须重视的问题。然而编写安全的应用程序,特别是跟网络相关的C/C++应用程序,是一件十分困难的事情。可以说,整个业界目前在这个进程上仍然处于“初级阶段”。特别是涉及到大量的安全、密码学相关的算法、规范,如果让开发者自己摸索,其工作量和难度达到了不现实的程度。因此必须借助可靠的相关程序才有可能提高程序的安全性。在这方面,OpenSSL是目前最好的选择,其内容之全面可靠,已经成为业界标杆。然而,由于安全编程固有的复杂性,即使使用penSSL,开发工作仍然是非常繁琐的。因此我们也希望能够尽快看到更简单、更易用的C/C++安全程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值