Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
1

Ошибка о повреждение кучи

28.08.2012, 15:17. Просмотров 2205. Ответов 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
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
132
//main.cpp
#include "MyString.h"
#include <iostream>
using namespace std;
 
//выбор операции над строками
char ExSelect(void);
 
//чтение строки с максимальной длиной len
bool Read(char *str,int max_len);
 
int main(void){
    char ch;
    char str[MAX_LEN];
    MyString *s1, *s2;
    
    setlocale(LC_ALL,"Rus");
 
    for(;;){
        system("cls");
 
        //выберем операцию над строками
        ch = ExSelect();
        if(ch == '0') break;
        
        cout << '\n';
 
        do{
            cout << "Введите строку 1: ";
        }while(!Read(str,MAX_LEN));
 
        s1 = new MyString(str);
 
        switch(ch){
        case'1':
            do{
                cout << "Введите строку 2: ";
            }while(!Read(str,MAX_LEN));
 
            s2 = new MyString(str);
                    
            cout << "Результат сравнения Compare: " << 
                s1->Compare(*s2) << '\n';   
            cout << "Результат сравнения strcmp: " <<
                strcmp(s1->GetStr(),s2->GetStr()) << '\n'; 
            
            delete s1;
            delete s2;
            
            break;
        case'2':
             do{
                cout << "Введите строку 2: ";
            }while(!Read(str,MAX_LEN));
 
            s2 = new MyString(str);
                    
            cout << "Результат сложения Concat: " << *s1 + *s2 << '\n';
            cout << "Результат сложения strcat:" <<
                strcat(s1->GetStr(),s2->GetStr()) << '\n'; 
            
            delete s1;
            delete s2;
            
            break;
        case'3':
            cout << "длина строки Length: " << s1->Length() << '\n';
            cout << "длина строки strlen: " << strlen(s1->GetStr()) << '\n';
            delete s1;
            break;
        case'4':
             do{
                cout << "Введите строку2: ";
            }while(!Read(str,MAX_LEN));
 
            s2 = new MyString(str);
 
            cout << "строка: " << s1->GetStr() << '\n';
            cout << "подстрока: " << s2->GetStr() << '\n';
            cout << "количество подстрок: " << s1->CalcSub(*s2) << '\n';
            
            delete s1;
            delete s2;
            break;
        }
        cout << '\n';
        system("pause");
    }
    return 0;
}
 
char ExSelect(void){
    char ch;
    
    cout << "Меню:\n"
         << " 1.Сравнение строк.\n"
         << " 2.Конкатенация строк.\n"
         << " 3.Длина строки.\n"
         << " 4.Количество подстрок.\n";
    do{
        cout << "Сделайте выбор(0-выход): ";
        fflush(stdin);
    }while(scanf("%c",&ch)!=1 || cin.rdbuf()->in_avail()!=1 ||
        ch < '0' || ch > '4');
    return ch;
}
 
bool Read(char *str,int max_len){
    int ch;
    int i = 0;
    
    fflush(stdin);
    
    for(;;){
        ch = getchar();
        if(ch == '\n'){
            ungetc(ch,stdin);
            break;
        }
 
        str[i++] = ch;
        if(i == max_len - 1) break;
 
    }
    str[i] = 0;
    
    if(getchar() == '\n') return true;
    else{
        cout << "Максимальная длина строки: " << max_len -1;
        return false;
    }
}
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
//MyString.cpp
#include "MyString.h"
#include <iostream>
using namespace std;
 
 
MyString::MyString(char *ptr){
    int n = strlen(ptr);
    
    if(n >= MAX_LEN)
        cout << "Максимальная длина строки: " << MAX_LEN - 1 << '\n';
    else{
        str = new char[n + 1];
        strcpy(str,ptr);
    }
}
    
MyString::MyString(int size){
    if(size >= MAX_LEN){
        cout << "Максимальная длина строки: " << MAX_LEN-1 << '\n'; 
    }else{
        str = new char[size];
        for(int i=0; i<=size;i++)
            str[i] = 0;
    }
}
    
MyString::MyString(const MyString &o){
    str = new char[strlen(o.str) + 1];
    strcpy(str,o.str);
}
 
MyString::~MyString(void){
        delete []str;
}
 
MyString::MyString(void){
    char *str = new char[1];
    *str = 0;
}
 
MyString MyString::operator=(MyString &ob2){
    delete []str;
    str = new char[strlen(ob2.str) + 1];
    strcpy(str,ob2.str);
    return *this;
}
 
int MyString::Length(void){
    int len = 0;
    while(str[len]) len++;
    
    return len;
}
 
int MyString::Compare(const MyString &ob2){
    int i = 0;
 
    while(str[i] == ob2.str[i]){
        if(!str[i]) return 0;
        i++;
    }
    if((str[i] - ob2.str[i]) < 0) return -1;
    return 1;
}
 
MyString MyString::operator+(const MyString &ob2){
    char *temp = new char[strlen(str) + strlen(ob2.str) + 1];
    strcpy(temp,str);
    strcat(temp,ob2.str);
    
    MyString result(temp);
    delete []temp;
    return result;
}
 
int SearchSub(const char *str, const char *substr){
    int result = 0;
    
    while(strstr(str,substr)){
        result++;
        str = strstr(str,substr) + strlen(substr) - 1;
    }
    
    return result;
}
 
int MyString::CalcSub(const MyString &ob2){
    return SearchSub(str,ob2.str);
}
 
ostream & operator << (ostream &stream,const MyString &ob){
    stream << ob.str;
    return stream;
}
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
//  MyString.h
#pragma once
#include <iostream>
using namespace std;
 
#define MAX_LEN 101
 
class MyString{
    char *str;
public:
    MyString(void);
    MyString(char *str);
    MyString(int size);
        
    MyString(const MyString &o);
    
    ~MyString(void);
    
    MyString operator=(MyString &ob2);
    MyString operator+(const MyString &ob2);
    
    int Length(void);
    int Compare(const MyString &ob2);
    int CalcSub(const MyString &ob2);
    
    char * GetStr(void) { return str; }
 
    friend ostream & operator << (ostream &stream,const MyString &ob);
};
 
ostream & operator << (ostream &stream,const MyString &ob);
int SearchSub(const char *str, const char *substr);
Добавлено через 45 секунд
Ошибка возникает при выполнение пункта 2.

Добавлено через 16 минут
Нашёл. Если кому интересно ошибка в функции strcar в main.

Добавлено через 1 минуту
Посдкажите, как привести программу к человеческому виду. Что исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 15:17
Ответы с готовыми решениями:

Ошибка при "сборе мусора" . Повреждение кучи
Привет ребята! Я совсем скверно знаю плюсы и не смотря на несколько лет...

Повреждение кучи
После выполнения программы выдаёт ошибку Debug Assertion Failed Помогите найти...

Повреждение кучи
Есть код #include &lt;iostream&gt; using namespace std; struct STUDENT { char...

Повреждение кучи
#ifndef _TASK2_H_ #define _TASK2_H_ #include &lt;iostream&gt; using namespace...

Повреждение кучи
Приветствую! Сделал, казалось бы, простую программу, но у меня возникает ошибка...

5
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
28.08.2012, 16:42 2
Цитата Сообщение от bgm313 Посмотреть сообщение
Нашёл. Если кому интересно ошибка в функции strcar в main.
что за ошибка,чем вызвана?
0
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
28.08.2012, 18:11  [ТС] 3
Функция strcat изменяет 1 операнд, дописывая к нему второй.
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
28.08.2012, 18:33 4
Цитата Сообщение от bgm313 Посмотреть сообщение
Функция strcat изменяет 1 операнд, дописывая к нему второй.
вообще-то,она и должна это делать
0
bgm313
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
28.08.2012, 21:12  [ТС] 5
Она изменяет 1 операнд, под который выделена динамическая память без соотв. преобразований.
0
alexey31415
59 / 59 / 7
Регистрация: 16.05.2010
Сообщений: 632
29.08.2012, 07:27 6
немного теории
Функция strcat присоединяет свой второй аргумент (строку) к первому
аргументу — массиву символов, содержащему строку. Первый символ второго
аргумента замещает нулевой символ ('\0'), который завершал строку в первом
аргументе. Программист должен быть уверен, что массив, используемый для
хранения первой строки, достаточно велик для того, чтобы хранить
комбинацию первой строки, второй строки и завершающего нулевого символа
(скопированного из второй строки).
0
29.08.2012, 07:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2012, 07:27

Странное повреждение кучи
Доброго времени суток, форумчане! Есть проект, в нем реализована функцию...

МНК, повреждение кучи
Аппроксимация методом наименьших квадратов.. Если не использовать...

Точка останова(повреждение кучи)
Прошу помочь, смотрел по форуму похожие темы - ответа не нашел void...


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

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

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