我编写了以下代码,用字符串r(20%)替换字符串s中的所有空格。例如。 s =“约翰史密斯先生”,在运行代码后应该是“Mr20%John20%史密斯”。
我的代码崩溃,它看起来像是内存泄漏,但不知道为什么会发生。谢谢。
void ReplaceStr(string &s, string &r)
{
int i = 0;
for(string::iterator it = s.begin(); it != s.end(); it++,i++)
{
if( *it == ' ')
{
s.replace(i,1,r);
}
}
}
答案 0 :(得分:5)
replace
的文档说" [a]与此对象相关的迭代器,指针和引用可能无效。"你的迭代器是一个不再存在的字符串版本的迭代器,所以你不能继续增加它,取消引用它,比较它,等等。
答案 1 :(得分:1)
当替换长度不等于目标大小时,构建副本通常更容易且几乎同样有效。
void ReplaceSpaces(std::string &s, const std::string &r) {
std::string result;
result.reserve(s.size());
for (char c : s) {
if (c == ' ') result += r;
else result.push_back(c);
}
using std::swap;
swap(s, result);
}
答案 2 :(得分:0)
更好的选择是不要使用迭代器:
void ReplaceStr(string &s, string &r)
{
for (int i = 0; i < s.lenght(); )
{
if (s[i] == ' ')
{
s.replace(i,1,r);
i += r.lenght();
}
else
i++;
}
}
快速简便。也许r长度可以存储在一个常量中以稍微改善性能。
void ReplaceStr(string &s, const string &r)
{
const int rSize = r.lenght();
for (int i = 0; i < s.lenght(); )
{
if (s[i] == ' ')
{
s.replace(i,1,r);
i += rSize;
}
else
i++;
}
}
这是有效的,因为s的亮度不断更新。