c++ 字符串替换程序 p324
字符串替换程序
C++ Primer 324页
// replace:从str字符串中查找oldVal字符串,如果找到就替换成newVal字符串。
void replace(string &str, const string &oldVal, const string &newVal) {
string tmp(str, 0, oldVal.size()); // 初始化一个str的子串,用于与oldVal进行比较。
auto head = str.begin(); // 指示tmp的begin()迭代器在str中的位置。
auto tail = head + oldVal.size(); // 指示tmp的end()迭代器在str中的位置。
if(str.size() < oldVal.size()) // 如果str比要查找的字符串还短,直接退出。
return;
while((tail-1) != str.end()) { // tail-1为tmp最后一个字符在str中的位置,只有最后一个字符有效就循环
if(tmp == oldVal) { // 在str中找到了oldVal
head = str.erase(head, tail);
for(const auto &v : newVal) { // 由于insert(p, b, e)返回的是void,所以使用insert(p, v)循环插入。
head = str.insert(head, v);
++head; // 指向插入字符的下一个字符。
}
if(str.end() - head >= oldVal.size()) { // 保证剩余的字符长度大于oldVal的长度
tail = head + oldVal.size();
tmp.assign(head, tail);
} else {
return;
}
} else {
tmp.erase(tmp.begin()); // 模拟队列操作。这里删除了第一个,string重新分配并复制,不划算。
tmp.insert(tmp.end(), 1, *tail); // 这两句替换成tmp = str.substr(head-str.begin(), oldVal.size());
++head;
++tail;
}
}
}
使用replace和下标版本
// replace:从str字符串中查找oldVal字符串,如果找到就替换成newVal字符串。
void replace(string &str, const string &oldVal, const string &newVal) {
size_t oldSize = oldVal.size();
size_t newSize = newVal.size(); // 不能保存一个str.size()的值,应该str在变化,长度也是在变化的。
string tmp(str, 0, oldSize);
size_t head = 0;
if(str.size() < oldSize)
return;
while(head + oldSize <= str.size()) {
if(tmp == oldVal) {
str.replace(head, oldSize, newVal);
head += newSize;
if(str.size() - head - 1 >= oldSize) { // "-1"是应为head是从0开始的,少减了一个。
tmp.assign(str, head, oldSize);
} else {
return;
}
} else {
tmp = str.substr(++head, oldSize);
}
}
}
c++ 字符串替换程序 p324的更多相关文章
- Python 实现类似sed命令的字符串替换小程序
环境 PyCharm, Windows 背景 sed命令 sed 's/原字符串/新字符串' 单引号中间是s表示替换,原字符串就是要被替换掉的字符串,新字符串就是想要的字符串. 效果 在命令行输入py ...
- 微信小程序字符串替换
字符串替换有两种,一种是替换一个子字符串,一种是将子字符串全部替换 替换一个子字符串 要求:将“ ”(空格)替换成“,” var isguestnumbername=“aaa bbb ccc” isg ...
- 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串
关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串 实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...
- nyoj113_字符串替换
字符串替换 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 编写一个程序实现将字符串中的所有"you"替换成"we" 输入 ...
- ACM 字符串替换
字符串替换 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 编写一个程序实现将字符串中的所有"you"替换成"we" 输入 ...
- poj 3981 字符串替换
字符串替换 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10871 Accepted: 5100 Descriptio ...
- 基于C#简单实现多个word文件和Excel文件的全局字符串替换
公司整理文档工作中,出现了一个需要使用全局字符替换多个word文档.excel文档中的内容的需求.虽然office.WPS都有全局替换的功能(ctrl+h),但是文件过多,且需要替换多次,工作量还是比 ...
- php字符串替换的几个函数
strtr() str_replace() substr_replace() preg_replace() strtr()的用法: <?php $str = "test"; ...
- Django(完整的登录示例、render字符串替换和redirect跳转)
day61 1. 登录的完整示例 复习: form表单往后端提交数据需要注意哪三点: 五一回来默写 <-- 谁写错成from谁 ...
随机推荐
- PPT文档学习小练习链接
1. <初识PPT2010> https://www.toutiao.com/i6486689592241029645/ 2. <PowerPoint2010实现折线图动态展示> ...
- CodeForces 519B A and B and Compilation Errors (超水题)
这道题是超级水的,在博客上看有的人把这道题写的很麻烦. 用 Python 的话是超级的好写,这里就奉上 C/C++ 的AC. 代码如下: #include <cstdio> #includ ...
- UDP代码编写、操作系统发展史、多道技术、进程理论与代码层面创建、进程join方法与进程对象方法
昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...
- 遇到奇怪的问题:web.py 0.40中使用web.input(),出现一堆奇怪的错误
有的请求很正常,有的请求就出现了500错误. 这里使用POST请求,然后在web.input()中出现了很长很长的错误. 猜测是这个机器上安装了python2.7 / python 3.6 / pyt ...
- Cesium中文网的朋友们
目前已开通知识星球-Cesium中文网的朋友们 注意:仔细思量好再进来,一旦付费,概不退费.下述内容均尽力而为. 1. 每月一次技术交流(Cesium为主),提供源码. 2. 每人5次/周免费提问(C ...
- [源码分析] Facebook如何训练超大模型 --- (3)
[源码分析] Facebook如何训练超大模型 --- (3) 目录 [源码分析] Facebook如何训练超大模型 --- (3) 0x00 摘要 0x01 ZeRO-Offload 1.1 设计原 ...
- 浅析Java中的线程池
Java中的线程池 几乎所有需要异步或并发执行任务的程序都可以使用线程池,开发过程中合理使用线程池能够带来以下三个好处: 降低资源消耗 提高响应速度 提高线程的可管理性 1. 线程池的实现原理 当我们 ...
- 什么是以特性为核心的持续交付|阿里巴巴DevOps实践指南
编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...
- linux环境变量添加
目录 一:linux环境变量加载文件 1.添加环境变量顺序 2.系统环境变量执行顺序 一:linux环境变量加载文件 1.在linux中添加环境变量怎么添加呢? 文件内 /etc/profile /e ...
- 学习Java第1天
今天所做的工作:1.了解Java语言的发展历史 2.安装了Eclipse软件 3.学习了Eclipse的基本使用方法 4.学习了Java基本输出语法 5.成功输出了helloworld 6.学习了Ja ...