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

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

Войти
Регистрация
Восстановить пароль
 
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
#1

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

30.09.2012, 17:30. Просмотров 838. Ответов 9
Метки нет (Все метки)

Ребят, помогите разобраться. Стоит задача создать программу со строками, 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".
Буду благодарен, если кто-то подбросит хорошую идею для реализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 17:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В заданной строке удалить заданную подстроку, сколько бы раз она не встречалась (C++):

Определить, сколько раз встречалась каждая буква в строке? - C++
Есть число N и N элементов. Элементы они же буквы от A до Z. Необходимо определить сколько раз встречалась каждая буква в строке? ...

Сколько раз заданное слово встречается в заданной строке - C++
Не знаю решения в консоли

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

Определить сколько раз в заданной строке встречаются указанные символы - C++
Дана строка символов S. Определить сколько раз в ней встречается символ + и сколько раз символ *. Задачу реализовать двумя способами: с...

Подсчитать, сколько раз в заданной строке встретился указанный символ - C++
Помогите пожалуйста:help: Написать и протестировать функцию, которая подсчитывает, сколько раз в заданной строке встретился указанный...

В строке заменить заданную подстроку - C++
string s1=&quot;int int int int&quot;; string s2=&quot;int&quot;; string s3=&quot;m&quot;; int t=s1.size(); cout&lt;&lt;s1; cout&lt;&lt;endl; ...

9
David Sylva
1288 / 950 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
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; 
}
1
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
01.10.2012, 20:24  [ТС] #3
Цитата Сообщение от David Sylva Посмотреть сообщение
Вот такой вариант
Спасибо конечно, но твой вариант с определенным заранее количеством символов в подстроке. А у меня количество символов не определено.
0
soon
2542 / 1307 / 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;
}
1
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;
Может заработает просто компа нет, планшет только под рукой
1
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?
0
David Sylva
1288 / 950 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
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;
}
1
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();
}
0
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 символом*/
        }
В итоге если слова равны полностью =) ну то есть все соотв символы, то просто пропускаем эти символы в исходной строке, а если равны не полностью, то все записываем....
1
darca
2 / 2 / 0
Регистрация: 30.09.2012
Сообщений: 7
02.10.2012, 11:04  [ТС] #10
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
У меня вот такое пашет, чуть подправил
Заработало Спасибо большое!

Цитата Сообщение от AnreyKazakov Посмотреть сообщение
j=0; /*Зачем-то обнуляем j, можно было в принципе инициализировать нулем в начале*/
Ты просто j в конце цикла обнулил, а я вначале обнулял.
0
02.10.2012, 11:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2012, 11:04
Привет! Вот еще темы с ответами:

Заменить первые вхождения заданной подстроки S1 на заданную подстроку S2 - C++
Помогите решить задачку пож. 1. Заменить первые вхождения заданной подстроки S1 на заданную подстроку S2 2. Удалить первые вхождения...

В заданной строке подсчитать сколько раз встречается символ "*" и сколько раз символ "+" - C++
Итак, сама задача: В заданной строке подсчитать сколько раз встречается символ &quot;*&quot; и сколько раз символ &quot;+&quot;. Указать смещение каждого...

Удалить заданную букву из предложения, если она имеет нечетный индекс - C++
Читается предложение и буква. удалить эту букву из всего предложения, но делать это в том случае, если номер буквы нечетный. (без...

Удалить из строки последнюю подстроку, совпадающую с заданной - C++
Даны строки S и S0. Удалить из строки S последнюю подстроку, совпадающую с S0 . Если совпадающих подстрок нет, то вывести строку S без...


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

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

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