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

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

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

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

06.08.2016, 09:58. Просмотров 796. Ответов 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 должна просто обновлять свое значение пока выполняется цикл ? Разъясните что да как в ней ))
Заранее спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2016, 09:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Замена строки в подстроке на новую строку (C++):

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

Копирование части строки, в новую строку - C++
Здравствуйте, помогите плиз с этой задачей. Заранее спасибо. Копирование в новую строку части исходной, начиная с элемента с заданным...

Из строки вывести некоторые элементы в новую строку - C++
Есть строка string: qqq-www aaa-sss zzz-xxx Должно получиться: qqq aaa zzz

Сформировать новую строку, состоящую из слов исходной строки - C++
задача такая: дана строка состоящая из слов разделенных пробелами сформировать новую строку состоящую из слов исходной строки Пример...

Получить из строк новую строку, содержащюю первые N1 символов строки S1 и последнии N2 символов строки S2 - C++
помогите написать программу на двух разных классах! 2) Даны целые положительные числа N1 и N2 и строки S1 и S2. Получить из этих строк...

Сформировать новую строку, состоящую из символов цифр исходной строки - C++
Вводится строка. Сформировать новую строку, состоящую из символов цифр исходной строки. Полученную строку преобразовать в число.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
06.08.2016, 10:30 #2
А лишняя подстрока в конец не добавляется?
0
Nigmatulin
0 / 0 / 0
Регистрация: 19.03.2016
Сообщений: 18
06.08.2016, 10:40  [ТС] #3
nmcf, нет, работает правильно, без лишних добавлений.
0
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
06.08.2016, 11:40 #4
Перед циклом должно быть:
C++
1
    SecondStringSize = 0;
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);
Я немного недопонимаю ее действия)
0
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 минуту
Надеюсь помог
1
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
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
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 закрывающие
один знак ';'
0
nmcf
06.08.2016, 13:01
  #9

Не по теме:

Ну опечатка.

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

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

Добавлено через 1 минуту
Цитата Сообщение от Krock21rus Посмотреть сообщение
советую запустить на тесте
a
a
aa
мой код отказывается работать )
0
Ferrari F1
=^_^=
570 / 457 / 94
Регистрация: 27.01.2015
Сообщений: 2,694
Записей в блоге: 1
Завершенные тесты: 1
06.08.2016, 13:25 #14
Nigmatulin, юзай std::string::replace для замены текста
0
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

и скажи, какой правильный ответ
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2016, 13:33
Привет! Вот еще темы с ответами:

Сформировать новую строку повторив каждый символ заданной строки дважды - C++
1. Дана строка символов. Сформировать новую строку, повторив каждый символ заданной строки дважды, начиная с конца строки (если заданная...

Сформировать из данной строки новую строку, удалив все кратные символы - C++
написать программу на си: дана строка АААВВСС, сформировать из нее новую строку АВС,удалив все кратные элементы. заранее спасибо)

Табуляция, переход на новую строку, конец строки и прочие подобные действия. endl; \n; - C++
Я запутался в этих знаках. Чем они отличаются и почему их часто ставят в разных местах строки? Иногда в начале строки, иногда в конце?...

Составить новую строку из всех гласных латинских букв исходной строки без повторений - C++
доброго времени суток. прошу помоч знающих людей. вобщем задание такое.. есть строка, выбрать из нее все латинские гласные буквы и...


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

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

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