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

Замена в строке цепочки символов - C++

Восстановить пароль Регистрация
 
corpdelta
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 15
29.03.2014, 20:35     Замена в строке цепочки символов #1
Как осуществить замену строки. Помогите закончить программу или дайте пример схожей задачки
строка s = hodgapo hodrono
строка t = hod
строка r = lo
вывод = logapo lorono
цепочка символов hod в с строке s заменяется на цепочку символов lo
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    char *s = "hodgapohodrono";
    char *t = "hod";
    char *r = "lo";
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2014, 20:35     Замена в строке цепочки символов
Посмотрите здесь:

Замена символов в строке C++
Замена символов в строке C++
Замена символов в строке C++
C++ Замена символов в строке
C++ Замена символов в строке
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Anton_Kretov
 Аватар для Anton_Kretov
89 / 51 / 7
Регистрация: 26.06.2013
Сообщений: 179
29.03.2014, 21:31     Замена в строке цепочки символов #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Интересно то, что вы сначала инклудите <string>, а потом прибегаете к использованию символьного указателя. В общем, даю вам код, думаю, все понятно. Если что-то не то - пишите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string s, t, r;
    cout << "Enter string s: "; getline(cin, s);
    cout << "Enter string t: "; getline(cin, t);
    cout << "Enter string r: "; getline(cin, r);
 
    cout << "\n" << "Source string: " << s;
    for(int i = 0; i < s.length(); i++) {
        if(s[i] == t[0]) {
            for(int j = 0, p = i; j < t.length(); j++, p++) {
                if(s[p] != t[j]) break;
                if((j == t.length() - 1) && (s[p] == t[j])) {
                    s.replace(i, p - i + 1, r);
                }
 
            }
        }
    }
 
    cout << "\n" << "New string: " << s;
    return 0;
}
corpdelta
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 15
29.03.2014, 23:40  [ТС]     Замена в строке цепочки символов #3
Спасибо большое. Все работает. Не могли бы немножко объяснить что происходит в строках 14-19. Простите за навязчивость, просто занимаюсь изучение програмирования не так давно.
Anton_Kretov
 Аватар для Anton_Kretov
89 / 51 / 7
Регистрация: 26.06.2013
Сообщений: 179
30.03.2014, 10:56     Замена в строке цепочки символов #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нет проблем. В строке 14 мы входим в цикл, в котором будем пробегать каждый символ строки s. В строке 15 мы проверяем, одинаков ли символ с индексом s[i] с первым символом строки t (той строки, которую потом будем менять). То есть, в этой строчке начинается вся замена с нахождения той подстроки t в самой строке s.
В строке 16 мы входим в новый цикл, который имеет параметры: j и p. Параметр j нужен для сравнения символов подстроки t (поэтому он и имеет начальноке значение - нуль). Параметр p при объявлении равен i (это сделано для того, чтобы сравнивать ПОСЛЕДУЮЩИЕ символы строки. К примеру:
aaabcbaaa - s
bcb - t
Мы заходим в цикл на строке 14, теперь мы на строке 15. Проверяем, i = 3, s[i] = 'b', а t[0] = 'b'. Все верно, идем в строку 16, заходим в цикл. Строка 17 проверяет каждый последующий символ подстроки t с последующим символом строки s , но проверяет как? Дословно строка звучит так:
ЕСЛИ символ строки s с индексом p НЕ РАВЕН символу строки t с индексом j, ТОГДА выходим из цикла. (Все верно, нам и нужно проверить всю строку, а как нам ее еще проверить?)
Строка 18. Эта строка звучит так:
ЕСЛИ параметр j равен индексу последнего символа в подстроке t И ЕСЛИ последний проверяемый символ строки s равен последнему символу подстроки t (первое условие нам нужно для того, чтобы удостовериться в том, что цикл проверил уже все символы строки, кроме последнего), ТОГДА делаем замену этой подстроки t в строке s на подстроку r. Функция replace относится к заголовку <string>, поэтому работает со строками. Параметры могут быть разные, но один из вариантов, который использовал я:
1 - с какого символа заменять (к примеру, в строке aaabcbaaa мы заменяем с символа 3 (b))
2 - сколько символов заменяем (p - i + 1) - это разница между последним символом и первым символом подстроки в строке s.
3 - на какую подстроку надо менять те символы, которые мы указали во 2-ом параметре.
Вот и все, если что-то непонятно объяснил, пишите в личку, помогу, рассказав детальней. Для понимания этого алгоритма вам достаточно понять, что делает второй цикл. Вы просто мысленно пройдитесь по строкам 14-19, на листе бумаги имея строки s, t, r. На каждом этапе смотрите, что делает алгоритм и какие символы затрагиваются. Мне так часто помогает понять чужой код.
Yandex
Объявления
30.03.2014, 10:56     Замена в строке цепочки символов
Ответ Создать тему
Опции темы

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