7 / 7 / 2
Регистрация: 25.12.2011
Сообщений: 111

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

29.09.2013, 21:00. Показов 3665. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru