string :: replace 100%的时间没有正常工作?

时间:2016-10-13 06:59:41

标签: c++ string replace

我正在尝试用字符串中的'%20'替换每个空格字符,我正在考虑为字符串类使用内置的替换函数。

目前,我有:

void replaceSpace(string& s)
{
    int len = s.length();
    string str = "%20";
    for(int i = 0; i < len; i++) {
        if(s[i] == ' ') {
            s.replace(i, 1, str);
        }
    }

}  

当我传入字符串“_a_b_c_e_f_g__”时,下划线代表空格,我的输出是“%20a%20b%20c%20e_f_g__”。同样,下划线代表空间。

为什么字符串开头附近的空格被替换,但是朝向结尾的空格不是?

5 个答案:

答案 0 :(得分:8)

每次更换都会使s更长,但您没有更新循环条件中使用的len

答案 1 :(得分:1)

修改刚刚扫描的字符串就像切割脚下的树枝一样。如果你小心的话可能会有用,但在这种情况下你不是。

即,您在开始时使用字符串len,但每次更换时,您的字符串会变得更长,并且您将更换的位置推得更远(因此您永远无法覆盖所有这些位置)。

切割这个分支的正确方法是从它的末端(尖端)到树干 - 这样你总能有一个安全的立足点:

void replaceSpace(string& s)
{
    int len = s.length();
    string str = "%20";
    for(int i = len - 1; i >= 0; i--) {
        if(s[i] == ' ') {
            s.replace(i, 1, str);
        }
    }

} 

答案 2 :(得分:0)

您正在增长字符串,但只能循环到其初始大小。

在修改它时对循环进行循环很容易出错。

这是一个没有的解决方案:

void replace(string& s)
{
    string s1;
    std::for_each(s.begin(),
                  s.end(),
                  [&](char c) {
                      if (c == ' ') s1 += "%20";
                      else s1 += c;
                  });
    s.swap(s1);
}

答案 3 :(得分:0)

正如其他人已经提到的那样,问题是你在循环中使用了初始字符串长度,但字符串在此过程中会变大。你的循环永远不会到达字符串的末尾。

您可以通过多种方法解决此问题。您可以更正您的解决方案,并确保按现在的方式转到字符串的末尾,而不是在开始循环之前。 或者你可以使用@molbdnilo的方式,它会沿途创建一个字符串的副本。 或者你可以使用这样的东西:

std::string input =  " a b c e f g  ";

std::string::size_type pos = 0;
while ((pos = input.find(' ', pos)) != std::string::npos)
{
    input.replace(pos, 1, "%20");
}

答案 4 :(得分:0)

这是一个可以让您更轻松的功能:

string replace_char_str(string str, string find_str, string replace_str)
{
    size_t pos = 0;
    for ( pos = str.find(find_str); pos != std::string::npos; pos = str.find(find_str,pos) )
     {
         str.replace(pos ,1, replace_str);
     }
     return str;
}

因此,如果您想要替换空格,请尝试这样:

string new_str = replace_char_str(yourstring, " ", "%20");

希望这对你有所帮助! :)