C++自定义全部替换函数replace

前言

今天遇到一个问题,需要把源字符串中的所有A串替换成B串,可能是最近写脚本写的太多了,第一反应就是使用replace()函数就完成了,在 LuaPython 中确实如此,但是我现在正在写C++啊,查询std::string发现确实有一个repalce()函数,但是查看定义后发现事情却不像想象的那样简单。

C++中的这个replace()函数显得过于“原始”,相比于其他脚本语言来说,用起来显得不太方便,不过很符合基础工具语言的特点,这个自带的repalce(pos, len, dst)函数的作用是从源字符串的第pos个字符开始,往后数len个字符,然后将这一部分替换成dst串。

有了这个替换函数,我们完全可以使用循环和查找函数完成全部替换,查找函数可以选择string::find(),从返回的找到的位置开始替换即可,若没有找到则会返回 string::npos,这时也就完成了所有的替换。

函数实现

代码很简单,就是利用循环、string::find()函数、string::replace()函数来进行适当的组合,逻辑很清晰,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <iostream>
using namespace std;

string replace(string& base, string src, string dst)
{
int pos = 0, srclen = src.size(), dstlen = dst.size();
while ((pos = base.find(src, pos)) != string::npos)
{
base.replace(pos, srclen, dst);
pos += dstlen;
}
return base;
}

关于是否需要返回值完全看你自己定义,我这里加了返回值只要是为了测试输出方便。

测试函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
string base1 = "1.0.0.1";
cout << replace(base1, ".", "[.]") << endl;

string base2 = "1【.】0【.】0【.】1";
cout << replace(base2, "【.】", "[.]") << endl;

string base3 = "1【.】0【.】0【.】1";
cout << replace(base3, "【.】", ".") << endl;

string base4 = "this is a book";
cout << replace(base4, "is", "are") << endl;

return 0;
}

运行结果

1[.]0[.]0[.]1
1[.]0[.]0[.]1
1.0.0.1
thare are a book

总结

  • 注意string::replace()函数与脚本中常用替换函数的不同
  • 使用string::find()函数查找不到待查串时会返回string::npos
Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客