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

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

Восстановить пароль Регистрация
 
 
Nigmatulin
 Аватар для Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 09:58     Замена строки в подстроке на новую строку #1
Все доброго времени суток. Я написал программу, которая в строке 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++ Табуляция, переход на новую строку, конец строки и прочие подобные действия. endl; \n;
C++ Замена пробелов в подстроке
C++ Копирование части строки, в новую строку
C++ Сформировать новую строку повторив каждый символ заданной строки дважды
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
06.08.2016, 10:30     Замена строки в подстроке на новую строку #2
А лишняя подстрока в конец не добавляется?
Nigmatulin
 Аватар для Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 10:40  [ТС]     Замена строки в подстроке на новую строку #3
nmcf, нет, работает правильно, без лишних добавлений.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
06.08.2016, 11:40     Замена строки в подстроке на новую строку #4
Перед циклом должно быть:
C++
1
    SecondStringSize = 0;
Nigmatulin
 Аватар для 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
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 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
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,476
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
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 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
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
06.08.2016, 13:09     Замена строки в подстроке на новую строку #10
Цитата Сообщение от Krock21rus Посмотреть сообщение
надо бы уточнить задачу
я всё ещё жду уточнений
что делать в случае, если str1 = "aa", а str2 = "aaa"?

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Krock21rus Посмотреть сообщение
советую запустить на тесте
a
a
aa
мой код отказывается работать )
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
06.08.2016, 13:25     Замена строки в подстроке на новую строку #14
Nigmatulin, юзай std::string::replace для замены текста
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
06.08.2016, 13:33     Замена строки в подстроке на новую строку #15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
юзай std::string::replace для замены текста
Цитата Сообщение от Nigmatulin Посмотреть сообщение
str.replace(SecondStringSize, str1.size(), str2);
это не одно и то же?

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

aaa
a
aa

и скажи, какой правильный ответ
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
06.08.2016, 13:34     Замена строки в подстроке на новую строку #16
Krock21rus, Одно и то же, я просто комментов и саму тему не читал, но раз у вас до сих пор возникают вопросы, то значит у вас что то не получается и поэтому я и написал, что надо использовать replace, чтобы все вопросы исчезли.
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
06.08.2016, 13:37     Замена строки в подстроке на новую строку #17
Ferrari F1, тут есть тема
найти минимум в массиве
так вот там всё кипит

Добавлено через 39 секунд
104 ответа там уже
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
06.08.2016, 13:58     Замена строки в подстроке на новую строку #18
Krock21rus, перед попыткой заменить все подстроки S2 в строке S1 на строку S3 надо обязательно проверить что S2 != S3. Иначе долго это всё будет.
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
06.08.2016, 14:16     Замена строки в подстроке на новую строку #19
IGPIGP, прочитайте, пожалуйста, все сообщения

тест

aa
a
aaa

будет долго работать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2016, 14:40     Замена строки в подстроке на новую строку
Еще ссылки по теме:

C++ Сформировать новую строку, состоящую из слов исходной строки
C++ Из строки вывести некоторые элементы в новую строку
Сформировать новую строку, состоящую из символов цифр исходной строки C++

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

Или воспользуйтесь поиском по форуму:
Nigmatulin
 Аватар для Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 14:40  [ТС]     Замена строки в подстроке на новую строку #20
Еще вопросик. Какую вы бы могли посоветовать литературу, которая ориентирована на работу со строками и есть ли вообще такая ?
Yandex
Объявления
06.08.2016, 14:40     Замена строки в подстроке на новую строку
Ответ Создать тему
Опции темы

Текущее время: 03:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru