Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
#1

Замена строки в подстроке на новую строку - C++

06.08.2016, 09:58. Просмотров 773. Ответов 26
Метки нет (Все метки)

Все доброго времени суток. Я написал программу, которая в строке S ищет подстроку S1 и заменяет ее на строку S2, но написал я эту программу с небольшой помощью интернета Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
using namespace std;
int main ()
{
    setlocale (0, "");
    string str, str1, str2;
    int i=0, SecondStringSize = 0;
    cout<<"Введите первую строку: "; getline(cin, str);
    cout<<"Введите вторую строку: "; getline(cin, str1);
    cout<<"Введите третью строку: "; getline(cin, str2);
    SecondStringSize = str1.size();
    while (SecondStringSize != string::npos)
    {
        str.replace(SecondStringSize, str1.size(), str2);
        SecondStringSize = str.find(str1, SecondStringSize);
    }
    cout<<"Строка после обработки: "<<str<<endl;
    system("pause");
    return 0;
}
Хотелось бы, что бы мне доходчиво объяснили вот эту строку: SecondStringSize = str.find(str1, SecondStringSize);
Что-то до меня она туговато доходит. Я понял это так, что переменная SecondStringSize должна просто обновлять свое значение пока выполняется цикл ? Разъясните что да как в ней ))
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2016, 09:58     Замена строки в подстроке на новую строку
Посмотрите здесь:
C++ Замена пробелов в подстроке
C++ Копирование части строки, в новую строку
C++ Из строки вывести некоторые элементы в новую строку
C++ Сформировать новую строку, состоящую из слов исходной строки
Сформировать новую строку, состоящую из символов цифр исходной строки C++
Сформировать из данной строки новую строку, удалив все кратные символы C++
C++ Сформировать новую строку повторив каждый символ заданной строки дважды
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5264 / 4584 / 1537
Регистрация: 14.04.2014
Сообщений: 18,213
06.08.2016, 10:30     Замена строки в подстроке на новую строку #2
А лишняя подстрока в конец не добавляется?
Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 10:40  [ТС]     Замена строки в подстроке на новую строку #3
nmcf, нет, работает правильно, без лишних добавлений.
nmcf
5264 / 4584 / 1537
Регистрация: 14.04.2014
Сообщений: 18,213
06.08.2016, 11:40     Замена строки в подстроке на новую строку #4
Перед циклом должно быть:
C++
1
    SecondStringSize = 0;
Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 12:05  [ТС]     Замена строки в подстроке на новую строку #5
nmcf, я же это сделал в восьмой строке
C++
1
int i=0, SecondStringSize = 0;
а перед циклом я уже узнаю размер строки.
P.S. Меня больше интересует строка 16:
C++
1
SecondStringSize = str.find(str1, SecondStringSize);
Я немного недопонимаю ее действия)
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
06.08.2016, 12:52     Замена строки в подстроке на новую строку #6
это не будет работать на таком тесте:
Кликните здесь для просмотра всего текста

a
a
aa

надо бы уточнить задачу
к примеру, какой ответ на таком тесте?
Кликните здесь для просмотра всего текста

aaaa
aa
b

справка по find
Return Value
The position of the first character of the first match.
возвращает индекс первого элемента в строке
Справка по replace
Цитата Сообщение от nmcf Посмотреть сообщение
Перед циклом должно быть:
* *
C++
1
SecondStringSize = 0;
если перед циклом сделать
C++
1
SecondStringSize = str.find(str1);
то будет более корректно

в 16 строчке у вас ищется строка str1 в подстроке str, которая начинается в SecondStringSize позиции и оканчивается в конце

Добавлено через 9 минут
более подробный анализ говнокода
все [a..b] означаю подстроку str с a до b
удобно писать [a..b], подразумевается [a..b)

Цитата Сообщение от Nigmatulin Посмотреть сообщение
int i=0
не нужно

Цитата Сообщение от Nigmatulin Посмотреть сообщение
SecondStringSize = str1.size();
устанавливает позицию, с которой мы начнём искать строку для замены

Цитата Сообщение от Nigmatulin Посмотреть сообщение
str.replace(SecondStringSize, str1.size(), str2);
заменяет строчку [SecondStringSize..SecondStringSize+str1.size()] на str2
замечу, что в начале ОБЯЗАТЕЛЬНО заменится ни в чём не виновная строчка [str1.size()..str1.size()*2], даже если она не равна str1

Цитата Сообщение от Nigmatulin Посмотреть сообщение
SecondStringSize = str.find(str1, SecondStringSize);
ищет в строке str начиная с позиции SecondStringSize(при чём она может быть за пределами строчки) строку str1, после чего записывает в SecondStringSize позицию первого элемента найденной строки

Добавлено через 1 минуту
попробуйте тест

aabb
сс
d

ваша программа выдаст aad

Добавлено через 38 секунд
Цитата Сообщение от Nigmatulin Посмотреть сообщение
работает правильно


Добавлено через 7 минут
Посмотреть наглядно(с дебагом) этот код:

Добавлено через 15 секунд
ideone

Добавлено через 5 минут
вот написал правильную реализацию: ideone

Конечно она сломается на тесте
a
a
a

действует тупо: пока может найти подстроку, заменяет её на нужную

Добавлено через 1 минуту
Надеюсь помог
nmcf
5264 / 4584 / 1537
Регистрация: 14.04.2014
Сообщений: 18,213
06.08.2016, 12:58     Замена строки в подстроке на новую строку #7
C++
1
2
    for (size_t SecondStringSize = str.find(str1); SecondStringSize != string::npos; SecondStringSize = str.find(str1, SecondStringSize))
        str.replace(SecondStringSize, str1.size(), str2);
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
06.08.2016, 13:00     Замена строки в подстроке на новую строку #8
Цитата Сообщение от nmcf Посмотреть сообщение
for (size_t SecondStringSize = str.find(str1); SecondStringSize)
2 открывающие скобки, 2 закрывающие
один знак ';'
nmcf
06.08.2016, 13:01
  #9

Не по теме:

Ну опечатка.

Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
06.08.2016, 13:09     Замена строки в подстроке на новую строку #10
Цитата Сообщение от Krock21rus Посмотреть сообщение
надо бы уточнить задачу
я всё ещё жду уточнений
что делать в случае, если str1 = "aa", а str2 = "aaa"?

Добавлено через 2 минуты
у наших решений(а может и у задачи) одна проблема:
мы изменяем исходную строчку и пытаемся продолжить с ней работать
в то время как str2 может быть равным str, а str1 может встречаться в str

Добавлено через 4 минуты
кстати можно прибавлять к SecondStringSize str1.size() после каждой замены, и это, наверное, будет работать.
Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 13:15  [ТС]     Замена строки в подстроке на новую строку #11
Krock21rus, спасибо. Очень помогли )
Я проверил пару раз свой код, и когда он выдал ожидаемый мною результат я обрадовался и не стал тестить с другими вариантами :c Спасибо, что все разъяснили все=) Код реализуется совсем проще, а не так как я перемудрил с ним
Цитата Сообщение от Krock21rus Посмотреть сообщение
я всё ещё жду уточнений
что делать в случае, если str1 = "aa", а str2 = "aaa"?
При вводе:
аааа
аа
b
выдает aab
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
06.08.2016, 13:20     Замена строки в подстроке на новую строку #12
Nigmatulin, а должно?

Добавлено через 1 минуту
советую запустить на тесте
a
a
aa
Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 13:23  [ТС]     Замена строки в подстроке на новую строку #13
Нет, мой код работает неверно. Как я и говорил выше, я проверил на нескольких самых простых вариантах код, ответ получился таким, какой я ожидал, и на этом остановился. Не подумал о других вариантах

Добавлено через 1 минуту
Цитата Сообщение от Krock21rus Посмотреть сообщение
советую запустить на тесте
a
a
aa
мой код отказывается работать )
Ferrari F1
=^_^=
553 / 440 / 93
Регистрация: 27.01.2015
Сообщений: 2,553
Записей в блоге: 1
Завершенные тесты: 1
06.08.2016, 13:25     Замена строки в подстроке на новую строку #14
Nigmatulin, юзай std::string::replace для замены текста
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2016, 13:33     Замена строки в подстроке на новую строку
Еще ссылки по теме:
C++ Табуляция, переход на новую строку, конец строки и прочие подобные действия. endl; \n;
Вставить новую строку после строки, в которой находится первый встречный минимальный элемент C++
Записать в новую строку слова исходной строки, в которых повторяющихся букв больше неповторяющихся C++
Составить новую строку из всех гласных латинских букв исходной строки без повторений C++
C++ Записать в новую строку все слова исходной строки у которых количество букв кратно 3

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 2
06.08.2016, 13:33     Замена строки в подстроке на новую строку #15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
юзай std::string::replace для замены текста
Цитата Сообщение от Nigmatulin Посмотреть сообщение
str.replace(SecondStringSize, str1.size(), str2);
это не одно и то же?

Добавлено через 48 секунд
Nigmatulin, попробуй

aaa
a
aa

и скажи, какой правильный ответ
Yandex
Объявления
06.08.2016, 13:33     Замена строки в подстроке на новую строку
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru