Заменить подстроку в std :: string, но не все из них, используя C ++ - PullRequest
1 голос
/ 31 октября 2019

Я новичок в C ++, я знаю, что мой пост можно найти дубликатом с другими постами, но я хочу сделать так, чтобы заменить подстроку в строке, но не все из них.

Этомоя функция поиска и замены подстроки, она работает как другая функция замены:

void findAndReplaceAll(std::string& data, std::string toSearch, std::string replaceStr)
{
//Get the first occurrence
size_t pos = data.find(toSearch);

//Repeat till end is reached
while (pos != std::string::npos)
{
    //Replace this occurrence of Sub String
    data.replace(pos, toSearch.size(), replaceStr);
    //Get the next occurrence from the current position
    pos = data.find(toSearch, pos + replaceStr.size());
}
}

Моя основная функция:

int main()
{
    std::string format = "h 'o''cloch' a, zzzz";
    findAndReplaceAll(format, "h", "%h");
    return 0;
}

Вывод, который я хочу, это просто заменить первую 'h 'но не второй' h 'один.

"%h 'o''cloch' a,zzzz";

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

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

Прототип функции будет выглядеть примерно так: void findAndReplaceAll(std::string& data, std::string toSearch, std::string replaceStr, int stopAfterXCharacters).

ВыЗатем потребуется изменить цикл while, чтобы он останавливался, когда было прочитано определенное количество символов.

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

1 голос
/ 31 октября 2019

Вы можете написать отдельную функцию, которая заменит только одну найденную строку.

Вот демонстрационная программа

#include <iostream>
#include <string>

bool findAndReplace( std::string &data, 
                     const std::string &toSearch, 
                     const std::string &replaceStr,
                     std::string::size_type pos = 0 )
{
    bool success = pos < data.size();

    if ( success )
    {
        success = ( pos = data.find( toSearch, pos ) ) != std::string::npos;

        if ( success )
        {
            data.replace( pos, toSearch.size(), replaceStr );
        }
    }

    return success;
}                     

int main() 
{
    std::string format = "h 'o''cloch' a, zzzz";

    findAndReplace( format, "h", "%h" );

    std::cout << "\"" << format << "\"\n";

    return 0;
}

Ее вывод

"%h 'o''cloch' a, zzzz"
...