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

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

Восстановить пароль Регистрация
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
29.09.2013, 21:00     Общие символы для двух строк(своего класса) через перегрузку оператора #1
Создать свой строковый класс, добавить функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк. Например, результатом пересечения строк "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 вместе с нужной строкой заноситься мусор
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 21:00     Общие символы для двух строк(своего класса) через перегрузку оператора
Посмотрите здесь:

Организовать перегрузку оператора (=) C++
C++ Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
C++ Найти общие для двух данных строк слова
Строка: Добавить в строковый класс функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк. C++
C++ Написать перегрузку для класса Fraction и double
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 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;
}
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
29.09.2013, 21:34  [ТС]     Общие символы для двух строк(своего класса) через перегрузку оператора #3
Ошибка исчезла, но в строке temp все равно кроме нужной строки выдается еще и мусор
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 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
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
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();
}
Миниатюры
Общие символы для двух строк(своего класса) через перегрузку оператора  
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 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'.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 22:04     Общие символы для двух строк(своего класса) через перегрузку оператора
Еще ссылки по теме:

C++ Реализовать для объектов данного класса перегрузку операции
C++ Реализовать для класса перегрузку операции []
C++ Перегрузка оператора + для сложения двух экземпляров класса

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

Или воспользуйтесь поиском по форуму:
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
29.09.2013, 22:04  [ТС]     Общие символы для двух строк(своего класса) через перегрузку оператора #7
Точно, просмотрел. Спасибо большое!
Yandex
Объявления
29.09.2013, 22:04     Общие символы для двух строк(своего класса) через перегрузку оператора
Ответ Создать тему
Опции темы

Текущее время: 19:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru