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

В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась - C++

Восстановить пароль Регистрация
 
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
30.09.2012, 17:30     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #1
Ребят, помогите разобраться. Стоит задача создать программу со строками, string.h желательно не использовать.
В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась.

Вот мой код:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "stdafx.h"
#include <conio.h>
 
using namespace std;
 
void main()
{
    setlocale(0,"Rus");
 
    int i,j,k;
    char a1[255], a2[255], b[255];
    k=0;
    j=1;
    
    cout<<"Введите строку: ";
    gets(a1);
    cout<<"Введите подстроку: ";
    gets(b);
    for (i=0; i<strlen(a1); i++)
    {
        if (a1[i]!=b[0])
        {
            a2[k]=a1[i];
            k++;
        }
        else
        {
            j=0;
            while (j<=strlen(b))
            {
                if (a1[i]!=b[j])
                {
                    a2[k]=a1[i];
                    k++;
                }
                i++;
                j++;
            }
            i--;
        }
    }
    cout<<"\nОтвет:"<<endl;
    for (i=0; i<k; i++)
        cout<<a2[i];
    _getch();
}
На данный момент программа считывает строку, подстроку и удаляет ее. Но я не пойму как мне сделать, что бы в случае, например, когда строка: "abcd", подстрока: "bs", ничего не удалялось. Как бы я не пробовал, все время удаляется "b".
Буду благодарен, если кто-то подбросит хорошую идею для реализации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 17:30     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась
Посмотрите здесь:

Подсчитать, сколько раз данный символ встречается в заданной строке C++
C++ Сколько раз символ повторяется в строке
C++ Как эффективно заменить подстроку в строке на другую подстроку?
C++ В заданной строке подсчитать сколько раз встречается символ "*" и сколько раз символ "+"
В заданной строке определить подстроку, являющуюся десятичной записью самого большого целого числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
30.09.2012, 20:07     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #2
Вот такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
int main() 
{ 
    char str[] = "Real Madrid Barca Real Chelsea Real"; 
    char asd [] = "Real"; 
    int size = strlen(str); 
    int i, j; 
     
       for ( i = 0; i < size; i++) 
           if(str[i] == asd[0] && str[i+1] == asd[1] && str[i+2] == asd[2] && str[i+3] == asd[3]) 
           { 
               for ( j = i; j < size - 1; j++) 
                   str[j] = str[j+strlen(asd)]; 
           size = size - strlen(asd);; 
           } 
 
           for ( i = 0; i < size; i++) 
              std:: cout << str[i]; 
           std::cout << std::endl; 
}
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
01.10.2012, 20:24  [ТС]     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #3
Цитата Сообщение от David Sylva Посмотреть сообщение
Вот такой вариант
Спасибо конечно, но твой вариант с определенным заранее количеством символов в подстроке. А у меня количество символов не определено.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.10.2012, 20:37     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
#include <boost/algorithm/string/erase.hpp>
 
int main()
{
    std::string str = "rabbit Follow rabbit the White Rabbit";
    boost::algorithm::erase_all(str, "rabbit ");
    std::cout << str << std::endl;
    return 0;
}
AnreyKazakov
Заблокирован
01.10.2012, 21:12     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #5
А если свою хочешь доделать, попробуй как вариант:
С 32 по 42 строчку заменить на
While ((j<strlen(b))&&(a1[i]==b[j])){
++i;
++j;
}
if(j<strlen(b){
i-=j;
a2[k]=a1[i];
++i;
++k;
}
j=0;
Может заработает просто компа нет, планшет только под рукой
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
01.10.2012, 23:14  [ТС]     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #6
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
А если свою хочешь доделать, попробуй как вариант
Хотелось бы свою, я просто делаю библиотеку, не думаю что преподаватель примет стандартные функции
Мне еще и нужно так сделать, что бы вместо char был wchar_t. Что бы работало в ASII и Unicode. Пока еще не сильно разобрался со всеми заголовками.

Добавлено через 1 час 51 минуту
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
While ((j<strlen(b))&&(a1[i]==b[j])){
++i;
++j;
}
if(j<strlen(b){
i-=j;
a2[k]=a1[i];
++i;
++k;
}
j=0;
Не заработало.
Я вообще уже не представляю как это можно реализовать без фиксирования длины подстроки...


Цитата Сообщение от soon Посмотреть сообщение
#include <iostream>
#include <string>
#include <boost/algorithm/string/erase.hpp>
int main()
{
* * std::string str = "rabbit Follow rabbit the White Rabbit";
* * boost::algorithm::erase_all(str, "rabbit ");
* * std::cout << str << std::endl;
* * return 0;
}
Это тоже не заработало. По крайней мере у меня. Не может найти #include <boost/algorithm/string/erase.hpp> Где мне взять этот erase.hpp?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
01.10.2012, 23:42     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #7
Цитата Сообщение от darca Посмотреть сообщение
Это тоже не заработало. По крайней мере у меня. Не может найти #include <boost/algorithm/string/erase.hpp> Где мне взять этот erase.hpp?
Что бы это заработало надо скачивать и подключать библиотеку boost
если интересно что такое boost http://www.boost.org/

Добавлено через 23 минуты
Если можно пользоваться средствами STL, то можно вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <iostream>
#include <algorithm>
int main() 
{ 
    std::string str; 
    std::string asd; 
    size_t pos;
    std::cout << "Inter a string " << std::endl; 
    std::getline(std::cin,str); 
 
    std::cout << "Inter a substring " << std::endl; 
    std::getline(std::cin, asd);
 
    while((pos = str.find(asd))!=std::string::npos) 
    str.erase(pos, asd.length()); 
 
    std::cout << str << std::endl;
}
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
02.10.2012, 00:04  [ТС]     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #8
Цитата Сообщение от David Sylva Посмотреть сообщение
Если можно пользоваться средствами STL, то можно вот так
Вот этот вариант работает, спасибо. Буду пробовать работать дальше с ним, а если таможня не пропустит, то возьму свой вариант, с нерабочей проверкой подстроки.

На данный момент код выглядит так. Запутался уже в нем сам, по идеи должен работать, может кто найдет ошибку?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "stdafx.h"
#include <conio.h>
#define max 255
 
using namespace std;
 
void main()
{
    setlocale(0,"Rus");
 
    int i,j,k,a;
    char a1[max], a2[max], b[max];
    k=0;
        
    cout<<"Введите строку: ";
    gets(a1);
    cout<<"Введите подстроку: ";
    gets(b);
    for (i=0; i<strlen(a1); i++)
    {
        if (a1[i]!=b[0])
        {
            a2[k]=a1[i];
            k++;
        }
        else
        {
            j=0;
            a=i-1;
            while ((j<=strlen(b))&&(a1[i]==b[j]))
            {
                if (a1[i]!=b[j])
                {
                    j=0;
                    while (j<=strlen(b))
                    {
                        i=a-10;//как бы не менял эту строку, результат не меняется
                        a2[k]=a1[i];//хотя должен записываться в массив символ начиная с a-10.
                        k++;
                        i++;
                    }
                    //break;
                }
                i++;
                j++;
            }
            i--;
        }
    }
    cout<<"\nОтвет:"<<endl;
    for (i=0; i<k; i++)
        cout<<a2[i];
    _getch();
}
AnreyKazakov
Заблокирован
02.10.2012, 01:29     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #9
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
using namespace std;
 
int main()
{
    setlocale(0,"Rus");
 
    int i,j,k;
    char a1[255], a2[255], b[255];
    k=0;
    j=1;
    
    cout<<"Введите строку: ";
    gets(a1);
    cout<<"Введите подстроку: ";
    gets(b);
    for (i=0; i<strlen(a1); i++)
    {
        if (a1[i]!=b[0])
        {
            a2[k]=a1[i];
            ++k;
        }
        else
        {
            j=0;
           while((j<strlen(b))&&(a1[i]==b[j])){
                ++i;
                ++j;
                }
           if(j<strlen(b)){
           i-=j;
           a2[k]=a1[i];
           ++k;
           }else{--i;}
 j=0;
        }
    }
    cout<<"\nОтвет:"<<endl;
    for (i=0; i<k; i++)
        cout<<a2[i];
    _getch();
}
У меня вот такое пашет, чуть подправил

Добавлено через 32 минуты
Закомментирую кусок этот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
else /*else срабатывает, если встретили первый одинаковый симол*/
        {
            j=0; /*Зачем-то обнуляем j, можно было в принципе инициализировать нулем в начале*/
           while((j<strlen(b))&&(a1[i]==b[j])){ /*Пока соотв символы равны и пока индекс b*/
/*(проверяемого слова) не равен размеру этого слова */
                ++i;/*прибавляем индекс исходной строки*/
                ++j;/*прибавляем индекс строки проверки*/
                }
           if(j<strlen(b)){ /*проверяем дошли ли индексом до конца слова*/
           i-=j;/*если нет, то возвращаем индекс исходной строки на место с которого */
/*начали сравнивать строки в цикле while сверху*/
           a2[k]=a1[i];/*присваиваем элемент с которого начали сравнение*/
/*потому что строки не равны (как минимум один символ )*/
           ++k; /*соотв увеличиваем индек новой строки*/
           }else{--i;}/*а если равны, то вычтем из индекса основной строки 1 , т к*/
/*когда сравнивали в цикле while посимвольно строки то уже ушли на последней итерации*/
/*за пределы слова b (j==strlen(b)), значит и i уже тоже удрал вперед, тк прибавляли их вместе*/
 j=0;/*обнуляем индекс b чтобы сравнивать с 1 символом*/
        }
В итоге если слова равны полностью =) ну то есть все соотв символы, то просто пропускаем эти символы в исходной строке, а если равны не полностью, то все записываем....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2012, 11:04     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
02.10.2012, 11:04  [ТС]     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась #10
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
У меня вот такое пашет, чуть подправил
Заработало Спасибо большое!

Цитата Сообщение от AnreyKazakov Посмотреть сообщение
j=0; /*Зачем-то обнуляем j, можно было в принципе инициализировать нулем в начале*/
Ты просто j в конце цикла обнулил, а я вначале обнулял.
Yandex
Объявления
02.10.2012, 11:04     В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась
Ответ Создать тему
Опции темы

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