我正在开发一个项目,我必须输入一个字符串(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;
答案 0 :(得分:2)
当您的FIND
来电失败时,此区域的index
位置不正确:
index = string1.find(string2, x);
string1.replace(index, n, string3);
在将index
传递给Replace
答案 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);