C ++查找/替换字符串

时间:2014-11-17 18:52:28

标签: c++ string replace find

如果这是一篇双重帖子,请提前感谢任何帮助并道歉,但我读了一些其他问题,但我找不到我想要的答案。

我正在开发一个项目,我必须输入一个字符串(String1),然后在String1中找到一个特定的字符串(String2)。然后我必须用新字符串(String3)替换String2。

希望这是有道理的。无论如何,我能够达到预期的效果,但它是情境性的。关于代码,我将在路上解释。

int main()
{
    string string1, from, to, newString;

    cout << "Enter string 1: ";
    getline(cin, string1);

    cout << "Enter string 2: ";
    cin >> from;

    cout << "Enter string 3: ";
    cin >> to;  

    newString = replaceSubstring(string1, from, to);

    cout << "\n" << newString;
}

string replaceSubstring(string string1, string from, string to)
{
        int index, n, x = 0;

        n = from.length();

        while (x < string1.length() - 1)
        {
            index = string1.find(from, x);
            string1.replace(index, n, to);
            x = index + to.length() - 1;
        }
        return string1;
}

我应该输入以下内容:&#34;他在这个小镇住了很长时间。他于1950年毕业。&#34;

然后我应该替换所有&#34;他&#34;与&#34;她&#34;。

当我尝试这个时,我收到以下错误:

  

在抛出&#39; std :: out_of_range&#39;的实例后终止调用
  what():basic_string :: replace
  中止(核心倾销)

但是,如果我输入类似的内容。

  

String1 =&#34;他和#34;
  String2 =&#34;他&#34;
  String3 =&#34;她&#34;

将输出:

  

&#34;她是&#34;

3 个答案:

答案 0 :(得分:2)

当您的FIND来电失败时,此区域的index位置不正确:

   index = string1.find(string2, x);
   string1.replace(index, n, string3);

在将index传递给Replace

之前检查{{1}}的值

答案 1 :(得分:1)

首先,如果函数将“原位”更改原始字符串会更好。在这种情况下,它看起来像一个类似于成员函数replace的泛型函数替换。

你应该检查一下电话后的索引

index = string1.find(string2, x);

等于std::string::npos。否则该函数将抛出异常。

此声明

x = index + to.length() - 1;

错了

应该看起来像

x = index + to.length();

例如,假设您的字符串值为"a",并希望将其替换为"ba"。在这种情况下,如果要使用您的语句x将等于1(x = 0 + 2 - 1)。并将指向“ba”中的“a”。并且该功能将再次将“a”替换为“ba”,您将获得“bba”等等。那就是循环将是无限的。

我会按照以下方式编写函数

#include <iostream>
#include <string>

void replace_all( std::string &s1, const std::string &s2, const std::string &s3 )
{
    for ( std::string::size_type pos = 0;
          ( pos = s1.find( s2, pos ) ) != std::string::npos;
          pos += s3.size() )
    {
        s1.replace( pos, s2.size(), s3 );
    }
}

int main() 
{
    std::string s1( "Hello world, world, world" );
    std::string s2( "world" );
    std::string s3( "mccdlibby" );

    std::cout << s1 << std::endl;

    replace_all( s1, s2, s3 );

    std::cout << s1 << std::endl;

    return 0;
}

输出

Hello world, world, world
Hello mccdlibby, mccdlibby, mccdlibby

答案 2 :(得分:1)

Find函数返回string x的起始索引,索引从0 to len-1开始,而不是1 to len

int idx = string1.find(string2, x);
if(idx >= 0)
    string1.replace(index, n, string3);