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

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

Войти
Регистрация
Восстановить пароль
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
#1

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

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

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

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

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

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

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

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

6
mishelle92
62 / 61 / 20
Регистрация: 09.10.2012
Сообщений: 201
Завершенные тесты: 1
29.09.2013, 21:14 #2
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
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
29.09.2013, 21:34  [ТС] #3
Ошибка исчезла, но в строке temp все равно кроме нужной строки выдается еще и мусор
0
mishelle92
62 / 61 / 20
Регистрация: 09.10.2012
Сообщений: 201
Завершенные тесты: 1
29.09.2013, 21:37 #4
Я запускал со своими исправлениями:

Enter your string: sdqcg
Enter your string: rgfas34
Your String is: sdqcg
Your String is: rgfas34
Result is:
Your String is: sg
0
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
29.09.2013, 21:43  [ТС] #5
Вот что у меня:
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
Миниатюры
Общие символы для двух строк(своего класса) через перегрузку оператора  
mishelle92
62 / 61 / 20
Регистрация: 09.10.2012
Сообщений: 201
Завершенные тесты: 1
29.09.2013, 21:48 #6
Кликните здесь для просмотра всего текста
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
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 100
29.09.2013, 22:04  [ТС] #7
Точно, просмотрел. Спасибо большое!
0
29.09.2013, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 22:04
Привет! Вот еще темы с ответами:

Перегрузка оператора + для сложения двух экземпляров класса - C++
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace::std; class str_type{ char...

Организовать перегрузку оператора = и объяснить для чего это сделано - C++
4)Организовать перегрузку оператора = и объяснить для чего это сделано

Реализовать для класса перегрузку операции [] - C++
Всем привет. помогите ПЖ с условием: Создать несколько объектов (например, a и b) разработанного класса. Класс – вектор (одномерный...

Реализовать перегрузку operator+() для пользователского класса - C++
Есть класс ДРОБЬ, его члены ЧИСЛИТЕЛЬ И ЗНАМЕНАТЕЛЬ, а методы - конструктор и методы вывода. исходные данные - 4 обычные дроби. мне нужно...


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

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

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