前言
今天遇到一个问题,需要把源字符串中的所有A串替换成B串,可能是最近写脚本写的太多了,第一反应就是使用replace()
函数就完成了,在 Lua
和 Python
中确实如此,但是我现在正在写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
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 | int main() |
运行结果
1[.]0[.]0[.]1
1[.]0[.]0[.]1
1.0.0.1
thare are a book
总结
- 注意
string::replace()
函数与脚本中常用替换函数的不同 - 使用
string::find()
函数查找不到待查串时会返回string::npos