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

news/2024/11/30 2:42:48/

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


一、基本知识:

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.ppmy.cn/news/1051442.html

相关文章

Vue3.X 路由与导航栏、侧边栏(四)

我们接着上一节的 Vue3.x 生命周期&#xff08;三&#xff09; 的说明&#xff0c;我们这一节讲解了项目中路由的配置与导航栏、侧边栏的关系。 一、路由配置 vue项目中路由配置有一个固有文件夹&#xff0c;可以配置路由&#xff0c;这样的优点使项目更加清晰明了。 如图&a…

【面试】项目经理面试题

文章目录 一、项目管理面试中通常会问到的问题1.项目管理软件工具知识2.做项目计划的技能3.人员管理技能4.沟通技巧5.方法论知识 二、问面试官的问题三. 面试系列推荐 一、项目管理面试中通常会问到的问题 1.项目管理软件工具知识 问题 1: 工期和工作量之间的差异是什么? 答案…

2023-08-21 LeetCode每日一题(移动片段得到字符串)

2023-08-21每日一题 一、题目编号 2337. 移动片段得到字符串二、题目链接 点击跳转到题目位置 三、题目描述 给你两个字符串 start 和 target &#xff0c;长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成&#xff0c;其中&#xff1a; 字符 ‘L’ 和 ‘R…

黑马头条-kafka配置

生产者配置 NAMEDESCRIPTIONTYPEDEFAULTVALID VALUESIMPORTANCEbootstrap.servershost/port列表&#xff0c;用于初始化建立和Kafka集群的连接。列表格式为host1:port1,host2:port2,…&#xff0c;无需添加所有的集群地址&#xff0c;kafka会根据提供的地址发现其他的地址&…

【PHP】PHP常见语法

文章目录 PHP简介前置知识了解静态网站的特点动态网站特点 PHP基础语法代码标记注释语句分隔(结束)符变量变量的基本概念变量的使用变量命名规则预定义变量可变变量变量传值内存分区 常量基本概念常量定义形式命名规则使用形式系统常量魔术常量 数据类型简单&#xff08;基本&a…

【0基础入门Python Web笔记】二、python 之逻辑运算和制流程语句

二、python 之逻辑运算和制流程语句 逻辑运算控制流程语句条件语句&#xff08;if语句&#xff09;循环结构&#xff08;for循环、while循环&#xff09;continue、break和pass关键字控制流程语句的嵌套以及elif 更多实战项目可进入下方官网 逻辑运算 Python提供基本的逻辑运算…

超级计算机

超级计算机是一种高性能计算机&#xff0c;它能够以极高的速度执行大规模的计算任务。超级计算机通常由数千个甚至数百万个处理器组成&#xff0c;这些处理器能够同时处理大量的数据&#xff0c;从而实现高效的计算。超级计算机广泛应用于科学、工程、金融、天气预报等领域&…

linux日志清理脚本

日常日志清理脚本&#xff1a; 1.压缩文件 SUFFIX$(date -d yesterday %Y-%m-%d) CURRENT$(date %s) echo $CURRENT #压缩 FILES(/data/logs/shop/nohup) for file in "${FILES[]}";doecho $fileFILENAME"$file.$SUFFIX.$CURRENT.gz"echo $FILENAMEgzip …