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

Общие символы для двух строк(своего класса) через перегрузку оператора

29.09.2013, 21:00. Показов 3623. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать свой строковый класс, добавить функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк. Например, результатом пересечения строк "sdqcg" "rgfas34" будет строка "sg". Для реализации функции перегрузить оператор * (бинарное умножение).
Вот что у меня получилось(выдает ошибку нарушение прав доступа):
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
class String{
private:
    char *str;
    int len;
public:
    String();//конструктор по умолчанию
    ~String() { delete [] str;}
    String(char *);//конструктор с параметром
    void GetString();//вывод строки
    void SetString();//ввод строки
 
    String operator*(const String& s2)
    {
        char *temp = new char[s2.len+1];
        int i=0;
        char *pch = strpbrk (str,s2.str);
        while (pch != NULL)                                        
        {
             temp[i] = *pch;                               
             pch = strpbrk (str+1,s2.str);  
             i++;
        }
        String result(temp);
        return result;
    }
};
 
String::String()
{
    len = 0;
    str = NULL;
}
 
String::String(char* instr)
{
    len = strlen(instr);
    str = new char[len+1];
    strcpy(str,instr);
}
 
void String::SetString()
{
    if(str != NULL) //если перед эти строка была задана с помощью конструктора с параметром,
    {               //очищаем ее
        delete [] str;
    }
    cout<<"Enter your string: ";
    char *strnew = new char[80];
    cin>>strnew;
    len = strlen(strnew);
    str = new char[len+1];
    strcpy(str,strnew);
    delete [] strnew;
}
 
void String::GetString()
{
    cout<<"Your String is: "<<str;
}
 
 
void main()
{
    String s1,s2("Hello"),s3;
    s1.SetString();
    s2.SetString();
    s1.GetString();
    cout<<endl;
    s2.GetString();
    s3 = s1*s2;
    cout<<endl;
        cout<<"Result is: \n";
    s3.GetString();
    getch();
}
Добавлено через 24 минуты
Цитата Сообщение от vozup Посмотреть сообщение
Создать свой строковый класс, добавить функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк. Например, результатом пересечения строк "sdqcg" "rgfas34" будет строка "sg". Для реализации функции перегрузить оператор * (бинарное умножение).
Вот что у меня получилось(выдает ошибку нарушение прав доступа):
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
class String{
private:
    char *str;
    int len;
public:
    String();//конструктор по умолчанию
    ~String() { delete [] str;}
    String(char *);//конструктор с параметром
    void GetString();//вывод строки
    void SetString();//ввод строки
 
    String operator*(const String& s2)
    {
        char *temp = new char[s2.len+1];
        int i=0;
        char *pch = strpbrk (str,s2.str);
        while (pch != NULL)                                        
        {
             temp[i] = *pch;                               
             pch = strpbrk (str+1,s2.str);  
             i++;
        }
        String result(temp);
        return result;
    }
};
 
String::String()
{
    len = 0;
    str = NULL;
}
 
String::String(char* instr)
{
    len = strlen(instr);
    str = new char[len+1];
    strcpy(str,instr);
}
 
void String::SetString()
{
    if(str != NULL) //если перед эти строка была задана с помощью конструктора с параметром,
    {               //очищаем ее
        delete [] str;
    }
    cout<<"Enter your string: ";
    char *strnew = new char[80];
    cin>>strnew;
    len = strlen(strnew);
    str = new char[len+1];
    strcpy(str,strnew);
    delete [] strnew;
}
 
void String::GetString()
{
    cout<<"Your String is: "<<str;
}
 
 
void main()
{
    String s1,s2("Hello"),s3;
    s1.SetString();
    s2.SetString();
    s1.GetString();
    cout<<endl;
    s2.GetString();
    s3 = s1*s2;
    cout<<endl;
        cout<<"Result is: \n";
    s3.GetString();
    getch();
}
В temp вместе с нужной строкой заноситься мусор
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2013, 21:00
Ответы с готовыми решениями:

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

Реализовать перегрузку оператора сложения пользовательского класса Ellipse для сложения двух полуосей эллипса
Нужно дополнить прогу конструктором\деструктором и перегруженой операцией, чтоб &quot;+&quot; делал сложение двух полуосей элипса: ...

Переопределение оператора () для своего класса
У меня вопрос. Как переопределить оператор () для своего класса?Если можно,приведите пример.

6
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
29.09.2013, 21:14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    String operator*(const String& s2)
    {
        char *temp = new char[s2.len+1];
        int i=0;
        char *pch = strpbrk (str,s2.str);
        while (pch != NULL)                                        
        {
             temp[i] = *pch;                               
             pch = strpbrk (pch+1,s2.str);  
             i++;
        }
        temp[i] = '\0';
        String result(temp);
        delete[] temp;
        return result;
    }
Еще надо добавить:

C++
1
2
3
4
5
6
String::String(const String& copy)
{
    len = copy.len;
    str = new char[len+1];
    strcpy(str,copy.str);
}
И:

C++
1
2
3
4
5
6
7
8
9
10
11
String& String::operator=(const String& copy)
{
    if(this == &copy)
        return *this;
    if(str)
        delete[] str;
    len = copy.len;
    str = new char[len+1];
    strcpy(str, copy.str);
    return *this;
}
1
7 / 7 / 2
Регистрация: 25.12.2011
Сообщений: 111
29.09.2013, 21:34  [ТС]
Ошибка исчезла, но в строке temp все равно кроме нужной строки выдается еще и мусор
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
29.09.2013, 21:37
Я запускал со своими исправлениями:

Enter your string: sdqcg
Enter your string: rgfas34
Your String is: sdqcg
Your String is: rgfas34
Result is:
Your String is: sg
0
7 / 7 / 2
Регистрация: 25.12.2011
Сообщений: 111
29.09.2013, 21:43  [ТС]
Вот что у меня:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
class String{
private:
    char *str;
    int len;
public:
    String();//конструктор по умолчанию
    ~String() { delete [] str;}
    String(char *);//конструктор с параметром
    void GetString();//вывод строки
    void SetString();//ввод строки
    String(const String&);//безопасное копирование строки
 
    String operator*(const String& s2)//перегрузка оператора *
    {
        char *temp = new char[s2.len+1];
        int i=0;
        char *pch = strpbrk (str,s2.str); //первый поиск
        while (pch != NULL && i != s2.len+1)    //дальнейший поиск                                    
        {
         temp[i] = *pch;                               
         pch = strpbrk (pch+1,s2.str);  
         i++;                                   
        }
        temp[i] = '\n';
        String result(temp);
        delete [] temp;
        return result;
    }
 
    String& operator=(const String& copy)//перегрузка оператора =
    {
        if(this == &copy)
            return *this;
        if(str)
            delete[] str;
        len = copy.len;
        str = new char[len+1];
        strcpy(str, copy.str);
        return *this;
    }
};
 
String::String(const String& copy)//безопасное копирование строки
{
    len = copy.len;
    str = new char[len+1];
    strcpy(str,copy.str);
}
 
String::String()
{
    len = 0;
    str = NULL;
}
 
String::String(char* instr)
{
    len = strlen(instr);
    str = new char[len+1];
    strcpy(str,instr);
}
 
void String::SetString()
{
    if(str != NULL) //если перед эти строка была задана с помощью конструктора с параметром,
    {               //очищаем ее
        delete [] str;
    }
    cout<<"Enter your string: ";
    char *strnew = new char[80];
    cin>>strnew;
    len = strlen(strnew);
    str = new char[len+1];
    strcpy(str,strnew);
    delete [] strnew;
}
 
void String::GetString()
{
    cout<<"Your String is: "<<str;
}
 
 
void main()
{
    String s1,s2("Hello"),s3;
    s1.SetString();
    s2.SetString();
    s1.GetString();
    cout<<endl;
    s2.GetString();
    s3 = s1*s2;
    cout<<endl;
    cout<<"Result is: \n";
    s3.GetString();
    getch();
}
Миниатюры
Общие символы для двух строк(своего класса) через перегрузку оператора  
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
29.09.2013, 21:48
Кликните здесь для просмотра всего текста
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
 
class String{
private:
    char *str;
    int len;
public:
    String();//конструктор по умолчанию
    ~String() { delete [] str;}
    String(char *);//конструктор с параметром
    String(const String& copy);
    void GetString();//вывод строки
    void SetString();//ввод строки
    String& operator=(const String&copy);
 
    String operator*(const String& s2)
    {
        char *temp = new char[s2.len+1];
        int i=0;
        char *pch = strpbrk (str,s2.str);
        while (pch != NULL)                                        
        {
             temp[i] = *pch;                               
             pch = strpbrk (pch+1,s2.str);  
             i++;
        }
        temp[i] = '\0';
        String result(temp);
        delete[] temp;
        return result;
    }
};
 
String::String()
{
    len = 0;
    str = NULL;
}
 
String::String(char* instr)
{
    len = strlen(instr);
    str = new char[len+1];
    strcpy(str,instr);
}
 
String::String(const String& copy)
{
    len = copy.len;
    str = new char[len+1];
    strcpy(str,copy.str);
}
 
void String::SetString()
{
    if(str != NULL) //если перед эти строка была задана с помощью конструктора с параметром,
    {               //очищаем ее
        delete [] str;
    }
    cout<<"Enter your string: ";
    char *strnew = new char[80];
    cin>>strnew;
    len = strlen(strnew);
    str = new char[len+1];
    strcpy(str,strnew);
    delete [] strnew;
}
 
void String::GetString()
{
    cout<<"Your String is: "<<str;
}
 
String& String::operator=(const String& copy)
{
    if(this == &copy)
        return *this;
    if(str)
        delete[] str;
    len = copy.len;
    str = new char[len+1];
    strcpy(str, copy.str);
    return *this;
}
 
 
void main()
{
    String s1,s2("Hello"),s3;
    s1.SetString();
    s2.SetString();
    s1.GetString();
    cout<<endl;
    s2.GetString();
    s3 = s1*s2;
    cout<<endl;
        cout<<"Result is: \n";
    s3.GetString();
    getch();
}


Попробуйте, может что-то я не написал/вы не увидели.

Добавлено через 1 минуту
Вместо '\n' нужно '\0'.
1
7 / 7 / 2
Регистрация: 25.12.2011
Сообщений: 111
29.09.2013, 22:04  [ТС]
Точно, просмотрел. Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2013, 22:04
Помогаю со студенческими работами здесь

Построить строку в которую войдут только общие символы двух строк в алфавитном порядке и без повторений
Даны две символьные строки, содержащие только строчные латинские буквы. Построить строку S3, в которую войдут только общие символы S1 и S2...

Написать перегрузку оператора "минус" для строк
Такой вопрос, для строк нужно написать оператор &quot;минус&quot;, что это значит? Если оператор &quot;+&quot; конкатенация строк, то что такое...

Копирование map через перегрузку оператора
Еще раз приветствую! Подскажите пожалуйста, не могу правильно перегрузить оператор присваивания для копирования содержимого одного класса в...

Найти общие для двух данных строк слова
Написал программу вот по этому заданию: С клавиатуры вводятся две строки, содержащие некоторые слова, перечисленные через точку с запятой....

Найти общие для двух заданных строк слова, и вывести их на экран
Задание: &quot;/*С клавиатуры вводятся две строки, содержащие некоторые слова, перечисленные через точку с запятой. Найти общие для этих...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки 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. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru