【问题标题】:string::replace not working correctly 100% of the time?string::replace 100% 的时间都不能正常工作?
【发布时间】:2017-02-22 04:21:47
【问题描述】:

我正在尝试将字符串中的每个空格字符替换为“%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__”。同样,下划线代表空格。

为什么字符串开头的空格被替换了,而结尾的空格没有?

【问题讨论】:

    标签: c++ string replace


    【解决方案1】:

    这里有一个功能可以让您更轻松:

    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");
    

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

    【讨论】:

      【解决方案2】:

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

      您有多种方法可以解决此问题。您可以更正您的解决方案并确保您按照现在的状态转到字符串的末尾,而不是像您开始循环之前那样。 或者您可以使用@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");
      }
      

      【讨论】:

        【解决方案3】:

        你正在增加字符串,但只是循环到它的初始大小。

        在修改集合时循环遍历它很容易出错。

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

        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);
        }
        

        【讨论】:

          【解决方案4】:

          修改你正在扫描的字符串就像砍掉你脚下的树枝。如果你小心,它可能会起作用,但在这种情况下你不是。

          也就是说,您在开头使用字符串 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);
                  }
              }
          
          } 
          

          【讨论】:

            【解决方案5】:

            每次替换都会使s 变长,但不会更新循环条件中使用的len

            【讨论】:

              猜你喜欢
              • 2013-01-27
              • 1970-01-01
              • 1970-01-01
              • 2021-12-30
              • 2015-08-09
              • 2014-01-11
              • 2018-10-10
              • 1970-01-01
              • 2021-10-15
              相关资源
              最近更新 更多