Проблемы с одинарными кавычками в функции поиска и замены C ++

StackOverflow https://stackoverflow.com/questions/1087088

  •  23-08-2019
  •  | 
  •  

Вопрос

Вот мой код для поиска последовательности в строке и замены ее другой:

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

Я надеюсь, что это поможет некоторым людям, сталкивающимся с такой же проблемой.

Это было полезно?

Решение

У вас получается бесконечный цикл, потому что ваше состояние не продвигается вперед.Ты всегда убегаешь j = source.find( find ), но ты заменяешь ' с '', таким образом, вы всегда находите первый апостроф каждый раз и добавляете новый апостроф к строке.

Вам нужно убедиться, что вы не используете один и тот же апостроф дважды, перемещая место сканирования вперед каждый раз, когда вы что-то заменяете.

В find функция принимает второй параметр, который является начальной позицией в строке для поиска подстроки.Как только вы найдете позицию первого совпадения, переместите начальную позицию до этой позиции плюс длину строки, на которую вы ее заменяете.

Другие советы

Потому что вы заменяете ' на ", затем снова выполняете поиск ', находя первое из тех, что вы только что туда поместили.Который вы заменяете.И так далее.

Вы пытаетесь заменить ту же строку, которую вы добавили.

Вероятно, лучше работать справа налево.Это работает для меня:

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top