第5天----单词替换(C++replace()函数)

当一句话中出现错误的单词时,你是否想快速将它替换为你想要的,接下来的这篇文章,将带你了解什么是单词替换。
在这里插入图片描述


一、基本知识:

1. string::replace()函数

C++ <string>库中的replace()函数是用于替换字符串中的特定字符或子字符串的函数。它的语法如下:

string replace (size_t pos, size_t len, const string& str);
  • 其中,pos是要替换的起始位置,len是要替换的字符或子字符串的长度,str是用于替换的字符串。(这三者也可以自己指定)

  • 该函数会将原始字符串中从pos位置开始的len个字符或子字符串替换为str,并返回替换后的字符串。

下面是一个使用replace()函数的示例:

#include <iostream>
#include <string>int main() {std::string str = "Hello, world!";std::cout << "原始字符串:" << str << std::endl;// 将字符串中的"world"替换为"everyone"str.replace(str.find("world"), 5, "everyone");std::cout << "替换后的字符串:" << str << std::endl;return 0;
}

输出结果为:

原始字符串:Hello, world!
替换后的字符串:Hello, everyone!
  • 在上面的示例中,我们使用find()函数找到了字符串中"world"的起始位置,并将其替换为"everyone"

二、小试牛刀:

题目描述:

输入一个字符串,以回车结束(字符串长度<=200)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入格式

1 1 1 行是包含多个单词的字符串 s s s

2 2 2 行是待替换的单词 a ( a( a( 长度<=100);

3 3 3 行是 a a a 将被替换的单词 b ( b( b( 长度 <=100)。

s , a , b s,a,b s,a,b 最前面和最后面都没有空格。

输出格式

输出只有 1 1 1 行,将 s s s 中所有单词 a a a 替换成 b b b 之后的字符串。

样例

样例输入

You want someone to help you
You
I

样例输出

I want someone to help you
  • 题意并不难懂,在分析之前,我先给出我的解法。
#include<iostream>
#include<string>
using namespace std;string  s,s1,s2;
int main(void)
{getline(cin, s);cin >> s1;cin >> s2;int len = s.length();size_t index=s.find(s1); while(index!=string::npos){s.replace(index, s1.length(), s2);index = s.find(s1, index + s2.length());		}cout << s;return 0;
}
  1. 首先我利用getline()读入整行句子s,然后读入s1,s2;
  2. 再利用string::find()函数循环查找该句子中是否存在目标单词,若有则立即替换,并且将下次的查找起始点更改为该处替换后单词的末尾。(do-while())。

我的解题历程:

  • 怎么样,是不是很简便?其实单词替换的本质还是单词的查找,这在前面我们就已经讲过,当目标单词找到后,即可替换。说来还算轻巧,但第一次做的时候可不容易:
    1️⃣刚开始是我想的是开一个vector来存储每个string字符串,然后在前n-2个单词中查找是否存在第n-1个单词,如果有,则用第n个单词将其替换;
    2️⃣然后遍历输出前n-2个单词即可。
  • 但问题来了,这样我怎么判断输入结束了呢❓
  • 每次输入一个string字符串,由于单词数目没有固定,所有有点难处理。但看看题目,说句子长度最多200个字符,那么最多可能有100个单词,再加上两个输入,或许可以利用其上限102开一个while()循环,在循环里指定条件,当s.length()>0时,再存储到vector中,虽然这样是可以的,但是平白无故地消耗了一些时间复杂度,并且这样做的空间复杂度也较大,所以到这里就果断舍弃这种思路,开始寻找其他的解决办法。
  • 后来我又想,要不开一个字符数组char[],利用fgets()函数读入一整行单词,这样似乎可以…再利用strstr()函数(C语言)循环查找就可以了,不过替换有点麻烦,可惜substr()是C++中定义的替换函数,可以直接替换某部分字符串(前面几节讲过),所以这样替换的效率也不高…权衡利弊之下,我只好选择了一种输入操作简便,替换效率又高的做法😄

三、其他解法:

另解1:

  • 题意:将一行字符串中的某个单词替换成指定单词(被替换的单词可能有多个)。

  • 解题提示:

    1. 不必要一个个字符读入,可以整体将某个单词读入,方便判断和输出。
    2. 可以创建一个字符串类型的数组存输入的每个单词。
    3. 在输入的时候可以顺便统计单词的个数。
  • 最后只要判断数组中每个单词是不是要替换的单词,如果是,输出想要替换的单词,不是就直接输出。

下面是代码:

#include<iostream>
#include<string>
using namespace std;
string a[105];
int main(){string s;int n=0;while(cin>>s) a[++n]=s;//a[++n]=s;等同于n++;a[n]=s;for(int i=1;i<=n-2;i++){//注意,读入的时候将想被替换的单词放在了 n-1 的位置,替换的单词放在了 n 的位置,所以循环一直到 n-2 即可。if(a[i]==a[n-1]) cout<<a[n]<<" ";//判断到要被替换的单词就输出替换它的单词。else cout<<a[i]<<" ";}return 0;
}
  • 这个其实就是我上面所说的循环输入的方法,在编译器中是无法确定是否输入完毕的,但的确也是一种方法,一般的评测平台都不会报错。

另解2:

  • 这道题可以直接一个一个比对,如果单词与 a 相同就输出 b,否则输出原单词。

  • 题目是让我们把一个单词替换成另一个单词,也就是字符串,并不是单个字符的替换,所以我们不妨试试字符数组。这里可以用 while 进行输入,不过这样就需要先将第一个单词输入;用do while其实也可以,并且不用先输入第一个单词

  • 我们将单词a替换成单词b时可以把单词b装住,也可以直接输出,但我用的是装住的方法,输出时记得加空格。如果用直接输出的也行,也一定要加空格!

  • 最后逐个输出即可,代码如下:

#include<bits/stdc++.h>//万能头~ 
using namespace std;
string a,b;//定义单词a和单词b 
string s[105]; 
//定义含多个单词的字符串,因为这里要替换的不是一个字符,而是一个字符串,所以我们可以用字符串数组~ (是一个不错的选择) 
int len=1;
int main()
{cin>>s[1];//因为我们用的是while输入,所以我们要先将第一个单词输进来~ while(getchar() == ' ')cin>>s[++len];//因为我们用的是字符串数组,所以我们要用while输入 cin>>a>>b;//这里不用解释了吧 for(int i=1;i<=len;i++) {if(s[i]==a) s[i]=b;//判断这个单词是否是单词a,是的话就把这个单词变成单词b cout<<s[i]<<" ";//输出,注:记得加空格!!! }return 0;
}

今天的讲解就到这里了,相信你也是收获满满吧!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【音视频】基于webrtc的聊天室的设计

目录 术语 webrtc建连流程 系统整体架构 信令服务器房间状态管理 用户加入房间流程 用户加入房间并推流&#xff1a; 其他用户订阅此用户流 用户加入房间并订阅房间其他所有用户 用户退出房间流程 平行集群模式​编辑 第一阶段demo 设计 参考文章 术语 sdp: 在webrt…

第一篇:编写 Hello World 程序

编写 Hello World 程序 Hello World 程序就是让应用程序显示 Hello World 字符串。这是最简单的应用&#xff0c;但却包含了一个应用程序的基本要素&#xff0c;所以一般使用它来演示程序的创建过程。本章要讲的就是在Qt Creator 中创建一个图形用户界面的项目&#xff0c;从而…

在Hive/Spark上执行TPC-DS基准测试 (PARQUET格式)

在上一篇文章:《在Hive/Spark上运行执行TPC-DS基准测试 (ORC和TEXT格式)》中,我们介绍了如何使用 hive-testbench 在Hive/Spark上执行TPC-DS基准测试,同时也指出了该项目不支持parquet格式。 如果我们想要生成parquet格式的测试数据,就需要使用其他工具了。本文选择使用另…

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…

Haproxy搭建web集群

Haproxy概念 HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理&#xff0c;是免费、快速并且可靠的一种解决方案。HAProxy非常适用于并发大&#xff08;并发达1w以上&#xff09;web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得…

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle&#xff08;app&#xff09;添加的依赖&#xff08;用不上的可以不加&#xff09;AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle&#xff08;app&#xff09;添加的依赖&…

基于Spring Boot的餐厅订餐网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的餐厅订餐网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springbo…

Android 命令行如何运行 JAR 文件

​ 最近有位老哥问了一个问题&#xff0c;说如果将java的jar文件在Android中执行&#xff1f;这个其实很简单的一个问题&#xff0c;直接写个App放里面不就可以了么&#xff1f;但是人家说没有App&#xff0c;直接使用命令行去运行。说明这个需求的时候&#xff0c;把我给整懵了…

游戏msvcr120.dll丢失怎样修复?msvcr120.dll丢失常见原因

在尝试运行某些游戏时&#xff0c;我遇到了“msvcr120.dll丢失”的错误提示。经过一番调查和尝试&#xff0c;我成功地解决了这个问题。msvcr120.dll是Visual C Redistributable Package的一部分&#xff0c;它包含了许多运行Windows应用程序所需的库和函数。当游戏或其他应用程…

10个好用的网络画图工具推荐,专业办公绘图必备!

在当今数字化时代&#xff0c;网络画图工具成为了各行各业的重要辅助工具。无论是制作流程图、思维导图、原型设计&#xff0c;还是插图绘制、数据可视化&#xff0c;网络画图工具为用户提供了便捷、高效的创作平台。本文将向大家推荐10个好用的网络画图工具&#xff0c;帮助你…

【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…

湖南省人民政府副省长秦国文一行莅临麒麟信安调研

&#xff08;通讯员 付瑞、周沁怡&#xff09;8月21日&#xff0c;湖南省人民政府副省长秦国文在长沙调研计算产业&#xff0c;省政府副秘书长季心诠、省科技厅厅长李志坚、省工信厅副厅长彭涛、市人民政府副市长肖正波、湘江新区&#xff08;长沙高新区&#xff09;管委会副主…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第二天&#xff09;Mybatis的深入学习&#xff08;增删改查的操作&#xff09; 上一篇我们的项目搭建好了&#xff0c;也写了简答的Junit测试类进行测试&#xff0c;可以正确映射…

Lnton羚通算法算力云平台如何在OpenCV-Python中使用cvui库创建复选框

CVUI 之 复选框 Python import numpy as np import cv2 import cvuidef checkbox_test():WINDOW_NAME Checkbox-Testchecked [False]# 创建画布frame np.zeros((300, 400, 3), np.uint8)# 初始化窗口cvui.init(WINDOW_NAME)while True:# 画布填色frame[:] (100, 200, 100…

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词&#xff0c;不影响任何鼠标键盘操作&#xff0c;不影响工作 2、利用系统热键快速隐藏&#xff08;ALT1键 隐藏与显示&#xff09; 3、日积月累单词会有进步 4、软件下载地址: 免安装&#xff0c;代码未加密&#xff0c;安全的屏幕水印学习英语…

机器人TF坐标系变换与一些可视化工具的应用

TF坐标在ROS中是一个非常重要的概念&#xff0c;因为机器人在做日常操作任务的时候&#xff0c;对于其所在位置和朝向是需要时刻知道的&#xff0c;而机器人是由很多节点组成的协同任务&#xff0c;对于每个部件&#xff0c;我们需要知道它的位姿(位置和朝向)&#xff0c;这使得…

链表OJ题

今天讲一些关于链表的Oj题&#xff0c;相信你看完对链表又提升一个档次。 题目一 思路一 遍历一遍链表是Val值得时候free这个&#xff0c;然后我们往后走&#xff0c;一直走到末尾空指针得时候&#xff0c;新链表就是我们得答案&#xff0c;那我们用代码来表示一下吧。 struct…

rabbitMQ服务自动停止(已解决

1、 在rabbitmq的sbin目录下操作 rabbitmq-plugins enable rabbitmq_management 2、 自己去rabbitmq_server-3.7.5文件夹下创建一个data&#xff0c;再执行这个命令&#xff08;用自己的目录哈 set RABBITMQ_BASED:\RabbitTools\RabbitMQ\rabbitmq_server-3.7.5\data 然后去配…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

微信小程序:模板使用

目录 模板的优点&#xff1a; 一、静态模板创建 二、静态模板使用 1.*.wxml引入模板 2.模板使用 3.*.wxss引入模板的样式 三、动态模板创建 四、动态模板使用 1.*.wxml引入模板 2.模板使用 3.*.js定义动态数据 五、结果展示 总结 模板的优点&#xff1a; 有利于保持网…