0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
1

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

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

Author24 — интернет-сервис помощи студентам
Все доброго времени суток. Я написал программу, которая в строке 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 должна просто обновлять свое значение пока выполняется цикл ? Разъясните что да как в ней ))
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2016, 09:58
Ответы с готовыми решениями:

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

Создать новую строку из символов 1-ой заданной строки, которые не входят во вторую заданную строку
Pascal:Создать новую строку из символов 1-ой заданной строки, которые не входят во вторую заданную...

Замена картинки по подстроке
Подскажите пожалуйста, почему не работает !? Надо по наличию слова в подстроке ставить ту или иную...

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

26
7774 / 6544 / 2981
Регистрация: 14.04.2014
Сообщений: 28,565
06.08.2016, 10:30 2
А лишняя подстрока в конец не добавляется?
0
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 10:40  [ТС] 3
nmcf, нет, работает правильно, без лишних добавлений.
0
7774 / 6544 / 2981
Регистрация: 14.04.2014
Сообщений: 28,565
06.08.2016, 11:40 4
Перед циклом должно быть:
C++
1
    SecondStringSize = 0;
0
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);
Я немного недопонимаю ее действия)
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
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 минуту
Надеюсь помог
1
7774 / 6544 / 2981
Регистрация: 14.04.2014
Сообщений: 28,565
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);
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
06.08.2016, 13:00 8
Цитата Сообщение от nmcf Посмотреть сообщение
for (size_t SecondStringSize = str.find(str1); SecondStringSize)
2 открывающие скобки, 2 закрывающие
один знак ';'
0
nmcf
06.08.2016, 13:01
  #9

Не по теме:

Ну опечатка.

0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
06.08.2016, 13:09 10
Цитата Сообщение от Krock21rus Посмотреть сообщение
надо бы уточнить задачу
я всё ещё жду уточнений
что делать в случае, если str1 = "aa", а str2 = "aaa"?

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Krock21rus Посмотреть сообщение
советую запустить на тесте
a
a
aa
мой код отказывается работать )
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2016, 13:25 14
Nigmatulin, юзай std::string::replace для замены текста
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
06.08.2016, 13:33 15
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
юзай std::string::replace для замены текста
Цитата Сообщение от Nigmatulin Посмотреть сообщение
str.replace(SecondStringSize, str1.size(), str2);
это не одно и то же?

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

aaa
a
aa

и скажи, какой правильный ответ
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
06.08.2016, 13:34 16
Krock21rus, Одно и то же, я просто комментов и саму тему не читал, но раз у вас до сих пор возникают вопросы, то значит у вас что то не получается и поэтому я и написал, что надо использовать replace, чтобы все вопросы исчезли.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
06.08.2016, 13:37 17
Ferrari F1, тут есть тема
найти минимум в массиве
так вот там всё кипит

Добавлено через 39 секунд
104 ответа там уже
1
Комп_Оратор)
Эксперт по математике/физике
8945 / 4699 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
06.08.2016, 13:58 18
Krock21rus, перед попыткой заменить все подстроки S2 в строке S1 на строку S3 надо обязательно проверить что S2 != S3. Иначе долго это всё будет.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
06.08.2016, 14:16 19
IGPIGP, прочитайте, пожалуйста, все сообщения

тест

aa
a
aaa

будет долго работать
0
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 14:40  [ТС] 20
Еще вопросик. Какую вы бы могли посоветовать литературу, которая ориентирована на работу со строками и есть ли вообще такая ?
0
06.08.2016, 14:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2016, 14:40
Помогаю со студенческими работами здесь

Для заданной строки сформировать новую строку, состоящую только из цифр, входящих в начальную строку
Функция записи и тестирования, которая для заданной строки формирует новую строку, состоящую только...

Замена символов верхнего регистра местами и вывод в новую строку
укажите пожалуйста на ошибки к примеру есть такая строка: AsdaB kgkgLasdH программа должна...

Замена текста в n-ой строке и k-ой подстроке
Здравствуйте, есть файлик такого типа: 0;?Is=0;!Is=4;Int=00:01:01;i0=-1,s0=9;i1........

Заданы две строки. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку
Прошу помощи!


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru