字符串替换程序

C++ Primer 324页

  1. // replace:从str字符串中查找oldVal字符串,如果找到就替换成newVal字符串。
  2. void replace(string &str, const string &oldVal, const string &newVal) {
  3. string tmp(str, 0, oldVal.size()); // 初始化一个str的子串,用于与oldVal进行比较。
  4. auto head = str.begin(); // 指示tmp的begin()迭代器在str中的位置。
  5. auto tail = head + oldVal.size(); // 指示tmp的end()迭代器在str中的位置。
  6. if(str.size() < oldVal.size()) // 如果str比要查找的字符串还短,直接退出。
  7. return;
  8. while((tail-1) != str.end()) { // tail-1为tmp最后一个字符在str中的位置,只有最后一个字符有效就循环
  9. if(tmp == oldVal) { // 在str中找到了oldVal
  10. head = str.erase(head, tail);
  11. for(const auto &v : newVal) { // 由于insert(p, b, e)返回的是void,所以使用insert(p, v)循环插入。
  12. head = str.insert(head, v);
  13. ++head; // 指向插入字符的下一个字符。
  14. }
  15. if(str.end() - head >= oldVal.size()) { // 保证剩余的字符长度大于oldVal的长度
  16. tail = head + oldVal.size();
  17. tmp.assign(head, tail);
  18. } else {
  19. return;
  20. }
  21. } else {
  22. tmp.erase(tmp.begin()); // 模拟队列操作。这里删除了第一个,string重新分配并复制,不划算。
  23. tmp.insert(tmp.end(), 1, *tail); // 这两句替换成tmp = str.substr(head-str.begin(), oldVal.size());
  24. ++head;
  25. ++tail;
  26. }
  27. }
  28. }

使用replace和下标版本

  1. // replace:从str字符串中查找oldVal字符串,如果找到就替换成newVal字符串。
  2. void replace(string &str, const string &oldVal, const string &newVal) {
  3. size_t oldSize = oldVal.size();
  4. size_t newSize = newVal.size(); // 不能保存一个str.size()的值,应该str在变化,长度也是在变化的。
  5. string tmp(str, 0, oldSize);
  6. size_t head = 0;
  7. if(str.size() < oldSize)
  8. return;
  9. while(head + oldSize <= str.size()) {
  10. if(tmp == oldVal) {
  11. str.replace(head, oldSize, newVal);
  12. head += newSize;
  13. if(str.size() - head - 1 >= oldSize) { // "-1"是应为head是从0开始的,少减了一个。
  14. tmp.assign(str, head, oldSize);
  15. } else {
  16. return
  17. }
  18. } else {
  19. tmp = str.substr(++head, oldSize);
  20. }
  21. }
  22. }

c++ 字符串替换程序 p324的更多相关文章

  1. Python 实现类似sed命令的字符串替换小程序

    环境 PyCharm, Windows 背景 sed命令 sed 's/原字符串/新字符串' 单引号中间是s表示替换,原字符串就是要被替换掉的字符串,新字符串就是想要的字符串. 效果 在命令行输入py ...

  2. 微信小程序字符串替换

    字符串替换有两种,一种是替换一个子字符串,一种是将子字符串全部替换 替换一个子字符串 要求:将“ ”(空格)替换成“,” var isguestnumbername=“aaa bbb ccc” isg ...

  3. 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

    关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...

  4. nyoj113_字符串替换

    字符串替换 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 编写一个程序实现将字符串中的所有"you"替换成"we"   输入 ...

  5. ACM 字符串替换

    字符串替换 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 编写一个程序实现将字符串中的所有"you"替换成"we"   输入 ...

  6. poj 3981 字符串替换

    字符串替换 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10871   Accepted: 5100 Descriptio ...

  7. 基于C#简单实现多个word文件和Excel文件的全局字符串替换

    公司整理文档工作中,出现了一个需要使用全局字符替换多个word文档.excel文档中的内容的需求.虽然office.WPS都有全局替换的功能(ctrl+h),但是文件过多,且需要替换多次,工作量还是比 ...

  8. php字符串替换的几个函数

    strtr() str_replace() substr_replace() preg_replace() strtr()的用法: <?php $str = "test"; ...

  9. Django(完整的登录示例、render字符串替换和redirect跳转)

    day61 1. 登录的完整示例                       复习:         form表单往后端提交数据需要注意哪三点:  五一回来默写    <-- 谁写错成from谁 ...

随机推荐

  1. PPT文档学习小练习链接

    1. <初识PPT2010> https://www.toutiao.com/i6486689592241029645/ 2. <PowerPoint2010实现折线图动态展示> ...

  2. CodeForces 519B A and B and Compilation Errors (超水题)

    这道题是超级水的,在博客上看有的人把这道题写的很麻烦. 用 Python 的话是超级的好写,这里就奉上 C/C++ 的AC. 代码如下: #include <cstdio> #includ ...

  3. UDP代码编写、操作系统发展史、多道技术、进程理论与代码层面创建、进程join方法与进程对象方法

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

  4. 遇到奇怪的问题:web.py 0.40中使用web.input(),出现一堆奇怪的错误

    有的请求很正常,有的请求就出现了500错误. 这里使用POST请求,然后在web.input()中出现了很长很长的错误. 猜测是这个机器上安装了python2.7 / python 3.6 / pyt ...

  5. Cesium中文网的朋友们

    目前已开通知识星球-Cesium中文网的朋友们 注意:仔细思量好再进来,一旦付费,概不退费.下述内容均尽力而为. 1. 每月一次技术交流(Cesium为主),提供源码. 2. 每人5次/周免费提问(C ...

  6. [源码分析] Facebook如何训练超大模型 --- (3)

    [源码分析] Facebook如何训练超大模型 --- (3) 目录 [源码分析] Facebook如何训练超大模型 --- (3) 0x00 摘要 0x01 ZeRO-Offload 1.1 设计原 ...

  7. 浅析Java中的线程池

    Java中的线程池 几乎所有需要异步或并发执行任务的程序都可以使用线程池,开发过程中合理使用线程池能够带来以下三个好处: 降低资源消耗 提高响应速度 提高线程的可管理性 1. 线程池的实现原理 当我们 ...

  8. 什么是以特性为核心的持续交付|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  9. linux环境变量添加

    目录 一:linux环境变量加载文件 1.添加环境变量顺序 2.系统环境变量执行顺序 一:linux环境变量加载文件 1.在linux中添加环境变量怎么添加呢? 文件内 /etc/profile /e ...

  10. 学习Java第1天

    今天所做的工作:1.了解Java语言的发展历史 2.安装了Eclipse软件 3.学习了Eclipse的基本使用方法 4.学习了Java基本输出语法 5.成功输出了helloworld 6.学习了Ja ...