Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 1
Регистрация: 30.09.2012
Сообщений: 7

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

30.09.2012, 17:30. Показов 2288. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2012, 17:30
Ответы с готовыми решениями:

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

Подсчитать, сколько раз буква «ф» содержится в заданной строке, и удалить все буквы «ф» из строки
Писать на c++ Подсчитать, сколько раз буква «ф» содержится в заданной строке, и удалить все буквы «ф» из строки. // Заменить каждую...

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

9
 Аватар для David Sylva
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
30.09.2012, 20:07
Вот такой вариант
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
2 / 2 / 1
Регистрация: 30.09.2012
Сообщений: 7
01.10.2012, 20:24  [ТС]
Цитата Сообщение от David Sylva Посмотреть сообщение
Вот такой вариант
Спасибо конечно, но твой вариант с определенным заранее количеством символов в подстроке. А у меня количество символов не определено.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
01.10.2012, 20:37
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
Заблокирован
01.10.2012, 21:12
А если свою хочешь доделать, попробуй как вариант:
С 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
2 / 2 / 1
Регистрация: 30.09.2012
Сообщений: 7
01.10.2012, 23:14  [ТС]
Цитата Сообщение от 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
1321 / 983 / 267
Регистрация: 17.05.2012
Сообщений: 2,687
01.10.2012, 23:42
Цитата Сообщение от 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
2 / 2 / 1
Регистрация: 30.09.2012
Сообщений: 7
02.10.2012, 00:04  [ТС]
Цитата Сообщение от 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
Заблокирован
02.10.2012, 01:29
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
2 / 2 / 1
Регистрация: 30.09.2012
Сообщений: 7
02.10.2012, 11:04  [ТС]
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
У меня вот такое пашет, чуть подправил
Заработало Спасибо большое!

Цитата Сообщение от AnreyKazakov Посмотреть сообщение
j=0; /*Зачем-то обнуляем j, можно было в принципе инициализировать нулем в начале*/
Ты просто j в конце цикла обнулил, а я вначале обнулял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.10.2012, 11:04
Помогаю со студенческими работами здесь

Выяснить, сколько раз она и та же буква встречалась в строке
не успеваю вовремя, помогите умоляю, требуется: Написать программу которая помагает выяснить сколько раз в строке s встречается одна и таже...

В заданной строке с нулевым завершителем вставить заданную подстроку, начиная с заданной позиции
Вот мое задание: В заданной строке с нулевым завершителем вставить заданную подстроку, начиная с заданной позиции. Прошу вас помочь...

Из заданной строки удалить заданную подстроку (каждое вхождение)
Из заданной строки удалить заданную подстроку(каждое вхождение) Например: Строка. Подстрока. Результат. Мимино. Ми. Но Ляляля....

Заменить заданную подстроку в исходной строке на другую заданную подстроку
Всем привет. Вот программа: Заменить заданную подстроку в исходной строке на другую заданную подстроку. Заменяемая и заменяющая подстрока...

Pаменять заданную подстроку в исходной строке на другую заданную подстроку
Всем привет. Я тут создаю программу, которая будет заменять заданную подстроку в исходной строке на другую заданную подстроку. А вот сам...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru