2013-11-26 2 views
0

Я пытаюсь использовать замену std :: string, но не смог сделать это успешно.std :: string replace from start and end

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

static void replaceString(string &input, const string &startString, const string &endString, const string &replacement) 
{ 
    size_t indexStart, indexEnd; 

    indexStart = input.find(startString); 
    indexEnd = input.find(endString); 
    if (indexStart != xml.npos) { 
     input.replace(indexStart, indexEnd-indexStart, replacement); 
    } 
} 

В конце этого ввода вход остается неизменным.

Что я здесь делаю неправильно?

С уважением

+1

Что такое xml в строке if (indexStrat! = Xml.npos)? –

+0

Какой вклад в функцию у вас есть? А что, если 'endString' не может быть найден? –

+0

xml был опечаткой. это вход. – chingupt

ответ

1

Как я это вижу, две проверки не хватает:

  1. Если endString не найден,
  2. Если endString найден перед темstartString, в этом случае, ваш вычитание в вычислить второй параметр replace() приведет к отрицательной длине, которая будет переполняться.

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

Попробуйте что-нибудь подобное вместо этого:

static bool replaceString(string &input, const string &startString, const string &endString, const string &replacement) 
{ 
    size_t indexStart, indexEnd; 
    indexStart = input.find(startString); 
    if (indexStart == input.npos) { 
     return false; 
    } 
    indexEnd = input.find(endString, indexStart); // Note the offset to start searching 
                // after the start index 
    if (indexEnd == input.npos) { 
     return false; 
    } 
    input.replace(indexStart, indexEnd-indexStart, replacement); 
    return true; 
} 

Программа испытаний:

int main (int, char**) 
{ 
    string s ("abcdefghijklmnopqrstuvwxyz"); 

    string start ("gh"); 
    string end ("pq"); 
    string replace ("GHIJKLMNO"); 
    bool ok = replaceString(s, start, end, replace); 

    std::cout << "1. found? " << ok << ", result: " << s << std::endl; 

    start = "pq"; 
    end = "de"; 
    ok = replaceString(s, start, end, replace); 

    std::cout << "2. found? " << ok << ", result: " << s << std::endl; 

    return 0; 
} 

Выход:

1. found? true, result: abcdefGHIJKLMNOpqrstuvwxyz 
2. found? false, result: abcdefGHIJKLMNOpqrstuvwxyz 
0

Этот ответ похож на Julien-L, но я думаю, вы также должны для продвижения indexStart, чтобы замена не перезаписывала ни одно из найденных startString.

static void replaceString(std::string &input, const std::string &startString, const std::string &endString, const std::string &replacement) 
{ 
    size_t indexStart = input.find(startString); 
    if (indexStart == input.npos) return; 
    indexStart += startString.size(); 

    size_t indexEnd = input.find(endString, indexStart); 
    if (indexEnd == input.npos) return; 

    input.replace(indexStart, indexEnd - indexStart, replacement); 
} 
Смежные вопросы