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谁 ...
随机推荐
- 微信小程序配置域名的时候提示“校验文件验证失败”
在微信小程序后台配置web-view的业务域名跟扫普通链接二维码打开小程序两项功能时, 一直提示"校验文件验证失败,请下载校验文件,上传到服务器指定的目录" 实际访问校验文件的路径 ...
- EgLine V0.3—LVGL官方拖拽式UI编辑工具(可导出代码)
** EdgeLine ** 是LVGL官方团队退出的一款拖拽式UI编辑工具,现在还处于测试间断,目前最新版本为v0.3,已经可导出代码. 注意: 使用该软件需要注册lvgl账号,这一步可能需要代理 ...
- Go 分布式令牌桶限流 + 兜底策略
上篇文章提到固定时间窗口限流无法处理突然请求洪峰情况,本文讲述的令牌桶线路算法则可以比较好的处理此场景. 工作原理 单位时间按照一定速率匀速的生产 token 放入桶内,直到达到桶容量上限. 处理请求 ...
- 【Java】IntelliJ IDEA 快捷键
IntelliJ IDEA 快捷键 1. Editing(编辑) 快捷键 介绍 Ctrl +Space 基本代码补全,输入字母按后列出匹配的词组 Ctrl+Shift+Space 智能代码补全,列出与 ...
- Cesium和Kaarta用高分辨率激光雷达可视化室内和地下环境
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium使急救人员和军事操作人员更容易快速评估和了解密集和不 ...
- Ansible + shell 实现部署fastdfs+nginx 实现图片服务器并提供动态缩放功能;
因为公司阿里服务器变动几次,手动部署了好几次fastdfs+nginx,于是就想到了自动化部署,以下为脚本内容,由于只是想把着功能实现,并未有完完整的判断逻辑: 以下为ansible-playbook ...
- 集合框架-TreeSet-Comparator比较器
1 package cn.itcast.p5.treeset.demo; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...
- linux信号 SIGINT SIGTERM SIGKILL
三者都是结束/终止进程运行. 1.SIGINT SIGTERM区别 前者与字符ctrl+c关联,后者没有任何控制字符关联. 前者只能结束前台进程,后者则不是. 2.SIGTERM SIGKILL的区别 ...
- 利用Jemalloc进行内存泄漏的调试
内存不符预期的不断上涨,可能的原因是内存泄漏,例如new出来的对象未进行delete就重新进行复制,使得之前分配的内存块被悬空,应用程序没办法访问到那部分内存,并且也没有办法释放:在C++中,STL容 ...
- HowToDoInJava 其它教程 2 · 翻译完毕
原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 JMS 教程 JMS 教 ...