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谁 ...
随机推荐
- Word2010制作收款单
原文链接:https://www.toutiao.com/i6488255406136099342/ 页面设置 选择"页面布局"选项卡,"页面设置"功能组,&q ...
- SYCOJ304末尾0的个数
https://oj.shiyancang.cn/Problem/304.html 首先数据范围不可能算出来的,那么就要看数的性质. 0是怎么来的首先我们知道,有一个0,就必然会有一个5和2. n!在 ...
- Java库中的LocalDate类
Java库中的LocalDate类 类库设计者决定将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个用来表示时间点的Date类:另一个是用来表示大家熟悉的日历表示法的LocalD ...
- 《剑指offer》面试题20. 表示数值的字符串
问题描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100"."5e2"."-123"."3.1 ...
- jsp文本框输入限制问题
1.jsp文本窗口实现控制输入格式 <input onkeyup = "value=value.replace(/[\W]/g,'')" onbeforepaste=&quo ...
- Python向mysql数据库插入数据
一.向表tcolor中插入数据的主要流程如下: import datetimeimport pymysql.cursorsconnection = pymysql.connect(host='loca ...
- 阿里巴巴如何进行测试提效 | 阿里巴巴DevOps实践指南
编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...
- java继承基础内容
1 /* 2 * 继承的好处: 3 * 1,提高了代码的复用性. 4 * 2,让类与类之间产生了关系,给第三个特征多态提供了前提. 5 * 6 * 7 * java中支持单继承.不直接支持多继承,但对 ...
- SDCC 的 MCS-51 汇编基础概念和传参方式
寄存器 Register 寄存器用于数据的临时存储, 其数据可以表示为 用于处理的数据字节 指向数据的地址 寄存器的结构 8051的寄存器几乎都是8位寄存器, 因为8位MCU处理的主要是8位数据, 如 ...
- 『无为则无心』Python函数 — 35、Python中的闭包
目录 1.闭包的概念 2.实现一个闭包 3.在闭包中外函数把临时变量绑定给内函数 4.闭包中内函数修改外函数局部变量 5.注意: 6.练习: 1.闭包的概念 请大家跟我理解一下,如果在一个函数的内部定 ...