C++ 将字符串解析为argc、argv

文章目录

  • 前言
  • 一、如何实现?
    • 1、实现split
    • 2、split双引号
    • 3、奇数下标元素加入结果
    • 4、偶数下标元素split空格
  • 二、完整代码
  • 三、使用示例
    • 1、解析命令行
    • 2、构造argc、argv
  • 总结


前言

一般开启子进程的时候,需要传参数,通常直接传输命令行字符串,进入main会自动转换为argc、argv的形式。有些时候会需要需要自己解析命令行的情况,通常采用split空格就可以了,但如果需要支持双引号则会麻烦一些。


一、如何实现?

1、实现split

实现一个简单的split

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
static std::vector<std::string> split(const std::string &str, char delim)
{
	std::vector<std::string> tokens;
	std::istringstream iss(str);
	std::string token;
	while (std::getline(iss, token, delim))
		if (!token.empty())
			tokens.push_back(token);
	return tokens;
}

2、split双引号

根据双引号进行分割。

for (auto i : split(str, '"')){

}

3、奇数下标元素加入结果

双引号分割的元素中,奇数下标说明是双引号中的内容,不需要进行空格分割。

std::vector<std::string> args;
if (n++ % 2 == 1)
args.push_back(i);

4、偶数下标元素split空格

偶数下标说明是双引号外的内容,需要进行空格分割。

if (n++ % 2 == 0)
	for (auto j : split(i, ' '))
		args.push_back(j);

二、完整代码

当前实现,支持双引号。但不支持双引号内嵌入双引号,需要实现也很简单,比如:
定义\为转移符号,对字符串"\\\""进行全局替换为'0'。split操作完之后再将'0'替换为"\""。如果'0'不行则换成其他唯一字符串。

#include <iostream>
#include <sstream>
#include <vector>
#include <string>
static std::vector<std::string> split(const std::string &str, char delim)
{
	std::vector<std::string> tokens;
	std::istringstream iss(str);
	std::string token;
	while (std::getline(iss, token, delim))
		if (!token.empty())
			tokens.push_back(token);
	return tokens;
}
static std::vector<std::string> parseArgv(const std::string &str)
{
	std::vector<std::string> args;
	int n = 0;
	for (auto i : split(str, '"'))
	{
		if (n++ % 2 == 0)
			for (auto j : split(i, ' '))
				args.push_back(j);
		else
			args.push_back(i);
	}
	return args;
}

三、使用示例

1、解析命令行

auto strArgv = parseArgv("ffmpeg -i \"D:\\my video\\test.mp4\" -f null _");
for (auto i : strArgv)
{
	printf("%s\n", i.c_str());
}

在这里插入图片描述

2、构造argc、argv

auto strArgv = parseArgv("ffmpeg -i \"D:\\my video\\test.mp4\" -f null _");
std::vector<char*> argv;
for (int i = 0; i < strArgv.size(); i++)
	argv.push_back((char*)strArgv[i].c_str());
// 调用ffmpeg的main
main(argv.size(), argv.data());

总结

以上就是今天要讲的内容,本文的实现是比较简单的,用的方法算是比较巧妙,只要支持split就可以用本文的方法实现命令行的解析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/632608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL使用Groupby分组后,选择每个分组某个值最大的那一行

思路是&#xff1a; 先定位分组后某个值最大的值是多少根据值去全表匹配&#xff0c;得到对应的行 比如有个表&#xff1a; SELECT * FROM my_table按照sku_id分组后&#xff0c;选择record_date最大的那一行的全部值&#xff0c;先分组&#xff1a; SELECT sku_id,max(rec…

党建管理系统源码 搭建智慧党建小程序+支持在线缴费、考试、学习 功能强大

随着信息技术的飞速发展&#xff0c;党建工作也迎来了数字化、智能化的新时代。为了提升党建工作的效率&#xff0c;优化党员参与体验&#xff0c;基于党建管理系统源码的智慧党建小程序非常好用。分享一款春哥智慧党建小程序源码&#xff0c;该小程序集成了在线缴费、考试、学…

什么是蜜罐,在当前网络安全形势下,蜜罐能提供哪些帮助

在当前的互联网时代&#xff0c;网络安全威胁日益严峻&#xff0c;攻击手段层出不穷。为了应对这些威胁&#xff0c;网络安全专家们不断探索新的防御手段&#xff0c;在过去的几年里&#xff0c;一种更加积极主动的网络安全方法正在兴起。蜜罐技术便是这样一种备受瞩目的主动防…

echers配置项:折线图,折现的颜色修改

如上图所示&#xff1a;红框内的折现颜色修改&#xff0c;并隐藏默认的点 series: [{data: [1, 230, 224, 218, 135, 147, 760,1500,1200,2500,2000],type: line,lineStyle: {color: #00DBFE // 折现颜色},symbol:none, // 不显示点smooth: true, // 折现角度&#xff1a;圆滑…

ARM架构安全特性之防御执行技术

安全之安全(security)博客目录导读 目录 1、侧信道攻击威胁 2、推测屏障Speculation Barriers 3、栈溢出攻击威胁 4、指针认证PAC 5、分支目标识别BTI 6、内存安全违规威胁 7、内存标记扩展MTE 8、加强数据保护 9、特权不可访问&#xff08;Privileged Access Never …

Unity Mirror 从入门到入神(一)

Mirror从入门到成神 文章目录 Mirror从入门到成神简介NetworkClientRegisterPrefabConnect (string address)Disconnect ()activeactiveHost NetworkServerSpawn 简介 Mirror是一个unity网络同步框架&#xff0c;基于MonoBehaviour生命周期的回调的基础上进行数值的同步&#…

算法day08

第一题 1. 两数之和 由上述题意所知&#xff0c;本题要采用二分法的解题思路&#xff0c;二分法主要是面向有序的数组且也满足二段性的数组&#xff0c;所谓二段性就是在一定的规则下能把该数组分成两个部分&#xff1b; 本题注意要点&#xff1a; 1、循环结束的条件&#xff…

MMDetection内三个实用工具详解:日志分析、结果分析、混淆矩阵

实用工具目录 一、日志分析使用方法实际案例 二、结果分析pkl结果文件生成使用方法实际案例 三、混淆矩阵使用方法实际案例遇到的UserWarning解决方案 MMDetection官方除了训练和测试脚本&#xff0c;他们还在 mmdetection/tools/ 目录下提供了许多有用的工具。本帖先为大家重点…

Blender雕刻建模_笔画,镜像,动态拓扑

笔画 笔画选项&#xff0c;一般是对刷子&#xff08;自由线&#xff09;工具设置 描边方法如下&#xff1a;标红的为常用 -间隔&#xff1a;按一定间隔应用笔画的结果 例如&#xff1a;笔刷半径50&#xff0c;笔画间隔100%&#xff08;笔刷直径的百分比&#xff09;&#x…

聚苯并咪唑(PBI)为超高性能工程塑料 未来应用前景较好

聚苯并咪唑&#xff08;PBI&#xff09;为超高性能工程塑料 未来应用前景较好 聚苯并咪唑&#xff08;简称PBI&#xff09;&#xff0c;是一类以苯并咪唑基团作为结构重复单元的杂环聚合物。聚苯并咪唑不溶于水&#xff0c;溶于强极性溶剂&#xff0c;具有耐高温、耐腐蚀、抗辐…

Java小游戏之汤姆猫

背景&#xff1a; 博主写过羊了个羊小游戏&#xff0c;客户觉得羊了个羊同学写过了&#xff0c;想换一个&#xff0c;于是笔者想到了汤姆猫。就是那个以前在苹果手机上的猫。 过程&#xff1a; 初始会有一个猫的图片展示&#xff0c;然后你点击按钮&#xff0c;猫会有不同动作…

Python筑基之旅-溯源及发展

目录 一、Python的起源 二、Python的版本更替及变化 三、Python的优缺点 四、Python的发展方向 五、Python之禅 六、推荐专栏/主页&#xff1a; 1、Python函数之旅&#xff1a;Functions 2、Python算法之旅&#xff1a;Algorithms 3、个人主页&#xff1a;https://mye…

湖南大学OS-2018期末考试(不含解析)

前言 不知道哪里翻出来的一张&#xff0c;看着确实像期末考卷&#xff0c;暂且放一下。或许做过&#xff0c;或许没做过。 总之答案不记得了。做完可以评论区发一下或者找我发出来。 共6道大题。 一、(30%) 1. &#xff08;6%&#xff09; 进程间通信的两种方法分别是什么&…

Media Encoder 2024 for Mac:专业的音视频编码神器

Media Encoder 2024 for Mac&#xff0c;作为Mac用户的专业音视频编码工具&#xff0c;凭借其强大的功能和用户友好的界面&#xff0c;深受专业人士的喜爱。它支持将各种格式的音视频素材转换为多种流行格式&#xff0c;如MP4、MOV、AVI等&#xff0c;满足不同的播放和发布需求…

python:functools.partial和functools.wraps使用

python&#xff1a;functools.partial和functools.wraps使用 1 前言 python内置的functools模块&#xff0c;提供了一些非常好用的类或者方法&#xff0c;其中functools.partial和functools.wraps的使用频率较高&#xff0c;本文将针对其分析使用。 2 使用 2.1 functools.p…

No module named ‘sklearn.metrics.ranking‘ 解决方法

错误代码 from sklearn.metrics.classification import * from sklearn.metrics.ranking import * 错误原因 sklearn这个文件夹下的_classification和_ranking前面有下划线&#xff01; 解决方法 第一步&#xff1a;找到sklearn位置&#xff0c;可以打开命令行输入 pip sh…

ASTM通信协议校验和计算方法

Lis通信接口开发 <STX> FN <Frame> <ETB>or<ETX> <CS><CR> <LF> 其中&#xff1a; <STX>&#xff1a;起始帧头&#xff08;0x02&#xff09; FN&#xff1a;帧号&#xff08;范围0&#xff5e;7&#xff0c;1&#xff5e;7完…

软考--试题六--抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory) 意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定他们具体的类 结构 适用性 1、一个系统要独立于它的产品的创建、组合和表示时 2、一个系统要由多个产品系统中的一个来配置时 3、当要强调一系列相关的产品对象的设…

问界新M5交付,「975」组合站稳中国豪华智电定位

‍作者 |老缅 编辑 |德新 5月15日&#xff0c;问界新M5已正式开启全国用户交付。从网传图片可以看到&#xff0c;华为余承东以及赛力斯AITO问界BU总裁何利扬亲自出席了首批交车仪式。 4月23日&#xff0c;在不到1个月前&#xff0c;新M5发布。新M5共推出三款车型&#xff1a; …

基于ASN.1的RSA算法公私钥存储格式解读

1.概述 RFC5958主要定义非对称密钥的封装语法&#xff0c;RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥&#xff0c;例如按照RSA算法&#xff0c;公钥是n和e&#xff0c;私钥是d和n。当需要将公私钥保存到文件时&#xff0c;需按照一定的格式保存。本文主要定义公私钥…