这是我在字符串中查找序列并将其替换为另一个序列的代码:
std::string find_and_replace( string &source, string find, string replace )
{
size_t j;
for ( ; (j = source.find( find )) != string::npos ; )
{
source.replace( j, find.length(), replace );
}
return source;
}
当我打电话时,一切正常:
find_and_replace(test, "foo", "bar")
我的申请要求我用两个单引号替换单引号,而不是双引号。例如,我会打电话:
find_and_replace(test, "'", "''")
但每当我打电话给这个时,函数会因某种原因冻结。有谁知道这个问题可能是什么原因?
编辑:根据我得到的答案,我修复了代码:
std::string find_and_replace( string &source, string find, string replace )
{
string::size_type pos = 0;
while ( (pos = source.find(find, pos)) != string::npos ) {
source.replace( pos, find.size(), replace );
pos += replace.size();
}
return source;
}
我希望这可以帮助一些人遇到同样的问题。
答案 0 :(得分:9)
你有一个无限循环,因为你的病情不会向前发展。您始终在运行j = source.find( find )
,但是您正在用'
替换''
,因此您每次都会找到第一个撇号,并在字符串中添加新的撇号。
每次更换东西时,你需要确保两次相同的撇号都不匹配。
find
函数接受第二个参数,该参数是字符串中查找子字符串的起始位置。找到第一场比赛的位置后,将起始位置移动到该位置加上您要替换它的弦长。
答案 1 :(得分:4)
因为你用'with'代替',然后再搜索',找到你刚放在那里的第一个。你替换哪个。等等。
答案 2 :(得分:1)
您正在尝试替换您添加的相同字符串。
答案 3 :(得分:1)
从右到左工作可能更好。这对我有用:
const std::string& replacestring( std::string& strString, const std::string& strOld, const std::string& strNew )
{
for ( int nReplace = strString.rfind( strOld ); nReplace != std::string::npos; nReplace = strString.rfind( strOld, nReplace - 1 ) )
{
strString.replace( nReplace, strOld.length(), strNew );
if ( nReplace == 0 )
break;
}
return strString;
}