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


一、基本知识:

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;
}

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐