当一句话中出现错误的单词时,你是否想快速将它替换为你想要的,接下来的这篇文章,将带你了解什么是单词替换。
一、基本知识:
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;
}
- 首先我利用
getline()
读入整行句子s
,然后读入s1,s2
; - 再利用
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:
-
题意:将一行字符串中的某个单词替换成指定单词(被替换的单词可能有多个)。
-
解题提示:
- 不必要一个个字符读入,可以整体将某个单词读入,方便判断和输出。
- 可以创建一个字符串类型的数组存输入的每个单词。
- 在输入的时候可以顺便统计单词的个数。
-
最后只要判断数组中每个单词是不是要替换的单词,如果是,输出想要替换的单词,不是就直接输出。
下面是代码:
#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;
}
今天的讲解就到这里了,相信你也是收获满满吧!