заменить подстроку данной строки в C ++ - PullRequest
2 голосов
/ 30 октября 2019

У меня есть код для замены содержимого подстроки данной строки. Это не работает, как я ожидал.

Насколько я понимаю, s3.find ("они") вернет 6. Поскольку pos не совпадает с string :: npos, то из позиции 6 2 символа в s3 заменяются строкой s4. Таким образом, s3 будет "Там Бои снова!"после замены. Тем не менее, вывод s3: «Там Боб и Билл снова!». Может ли кто-нибудь помочь объяснить?

#include <iostream>
#include <string>
using namespace std;
string prompt("Enter a line of text: "),
line( 50, '*');

int main()
  {

    string s3("There they go again!"),
           s4("Bob and Bill");
    int pos = s3.find("they");
    if( pos != string::npos )
        s3.replace(pos, 2, s4);
    cout << s3 << endl;
    cout << s4 << endl;
    return 0;
}

1 Ответ

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

Тем не менее, вывод s3: «Там Боб и Билл снова!». Может ли кто-нибудь помочь объяснить?

Не совсем. Вывод «Там Боб и Билл эй идти снова». Начиная со слова they, первые два символа (th) были заменены на Bob and Bill. Результат - There Bob and Billey go again!.

Это поведение согласуется с объяснением, приведенным в этой документации: std::string::replace:

Заменяет часть строки, которая начинается всимвол pos и охватывает len символов (или часть строки в диапазоне между [i1, i2)) новым содержимым:

(1) копий строк str.

Если вы хотите, чтобы ваш вывод был "There Boey go again!", вы можете сделать это так:

int size = 2; // amount of characters that should be replaced
if (pos != string::npos)
    s3.replace(pos, size, s4.substr(0, size));
...