С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для Rexer
167 / 166 / 46
Регистрация: 10.10.2010
Сообщений: 725

Класс строк.

26.10.2011, 23:41. Показов 592. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Пишу класс строк.Возникла такая проблема..Когда перегружаю оператор* используя его как проверку на пересечение двух строк,то программа крашится сразу..Почему так я не понимаю,поэтому прошу вас помочь!
Вот мой код.
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include<iostream>
#include<string.h>
#include<cstdlib>
using namespace std;
 
class String
{
    char *data;
    int sz;
 
    public:
    //Конструктор
    String (){ data = "" ; sz = 0; }
    String (String &str)
    {
        delete[]data;
        sz = str.sz;
        data = new char[sz + 1];
        memcpy(data,str.data,sz + 1);
    }
    String (char str)
    {
        delete[]data;
        data = new char[2];
        data[0] = str;
        data[1] = '\0';
        sz = 1;
    }
    String (char *str)
    {
        delete[]data;
        sz = strlen(str);
        data = new char[sz + 1];
        memcpy(data,str,sz + 1);
    }
~String ()
{
    delete[]data;
}
//Перегружаем оператор присваивания
    String operator = (const String &s)
    {
        delete[]data;
        data = new char[(sz = s.sz) + 1];
        memcpy(data,s.data,(sz = s.sz) + 1);
        return *this;
    }
//Сцепление/Конкатенация Строк
    friend String operator+(const String&, const String&);
//Пересечение строк.Перегружаем *
    friend String operator*(const String&, const String&);
//Перегружаем операторы ввода и вывода
    friend ostream &operator<<(ostream &,const String &s);
    friend istream &operator>>(istream&, String &s);
 
};
 
ostream &operator<<(ostream &out,const String &s)
{
    out << "String : " << s.data << " Size : " << s.sz;
    return out;
}
 
istream& operator>>(istream& is, String& str)
{
    const int N = 65536;
    char temp[N] = {'0'};
    int Length = 0, //длина последней введенной строки,
    Total = 0; //общая длина ввода;
    // ввод продолжается до ввода пустой строки
    do
    {
        is.getline(temp + Total, N - Total);
        Length = strlen(temp + Total);
        // если строка пуста
        if(Length == 0)
            break;
        Total += Length + 1/* 1 - это \n */;
        temp[Total - 1] = '\n';
    } while(Total < N);
    // Убираем последний Enter,который нажимаем для ввода строки
    temp[Total - 1] = 0;
    str = temp;
    return is;
}
 
String operator*(const String&str1, const String&str2)
{
    String S;
    S.sz = str1.sz + str2.sz;
    S.data = new char[S.sz + 1];
    int len1 = str1.sz;
    int len2 = str2.sz;
    int k = 0;
    for(int i = 0 ; i < len1; i++)
    for(int j = 0; j < len2; j++)
    {
        if(str1.data[i] == str2.data[j])
        {
            S.data[k] = str1.data[i];
            k++;
            break;
        }
    }
    S.data[k] = '\0';
    S.sz = strlen(S.data);
    return S;
}
 
String operator+(const String &str1, const String &str2)
{
    String s;
    s.sz = str1.sz + str2.sz;
    s.data = new char[s.sz + 1];
    strcpy(s.data, str1.data);
    strcat(s.data, str2.data);
    return s;
}
 
int main()
{
    String s("Kill me please");
    cout << s << endl;
    cout << "Enter string (Enter empty string to continue) : \n";
    cin >> s;
    cout << s << endl;
    String s1(" I don't know why i like football");
    cout << s+s1 << endl;
    cout << s*s1;
    return 0;
}
В чем проблема?Если закомментить все,кроме
C++
1
 cout << s*s1;
,то все работает,так же без него все норм.В чем же тогда проблема?
Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2011, 23:41
Ответы с готовыми решениями:

Класс "Текст" (массив строк) для ограниченного числа строк
Здравствуйте, мне задали лабораторную и я вообще не представляю как это делается, помогите пожалуйста: Свойства: ...

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

Класс строк
Доброго времени суток) классы вот только начал изучать, прошу сильно не бить) Вот задание: Создать класс строк и производный от него -...

1
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
27.10.2011, 00:27
C++
1
2
3
4
5
6
7
String (char *str)
    {
        delete[]data;
        sz = strlen(str);
        data = new char[sz + 1];
        memcpy(data,str,sz + 1);
    }
1)При создании объекта поле data содержит мусор. Вы пытаетесь освободить память по адресу мусора. Это ошибка времени выполнения, конечно.
2) Если рассуждать по логике, почему вы удаляете data, если вы только что создаете объект?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2011, 00:27
Помогаю со студенческими работами здесь

Передача строк в класс
Доброго времени суток! Прошу помочь разобраться со следующей задачей. Есть класс User, в котором находится логин и пароль пользователя(то...

Класс множество строк
Здравствуйте, мне нужно написать класс множество строк. Как будет выглядеть класс? class SetString{ char *str; int...

Класс, динамический массив строк
Здравствуй, пользователь. Сегодня, наконец выбравшись из рид онли и пройдя процесс регистрация, я спешу попросить тебя о помощи. Что я...

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

Класс строк, необходима ли инкапсуляция?
Волнует такой вот вопрос, писал класс строк с целью перегрузки операторов, в качестве полей класса: массив char'ов и целочисленный тип,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru