为什么用%20程序崩溃替换空格?

时间:2014-04-19 03:53:19

标签: c++ string

我编写了以下代码,用字符串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);
        }
    }
}

3 个答案:

答案 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的亮度不断更新。