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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Динамическое выделение памяти http://www.cyberforum.ru/cpp-beginners/thread643486.html
Пусть есть класс с полем char *p. Если для поля p выделяется память динамически, как для массива и для самих объектов память выделяется тоже динамически в main. То где ловить исключения, которые могут быть связаны с выделением памяти: и в конструкторах и в основной программе или только в основной программе, а в конструкторах выбрасывать соотв.исключения?
C++ Вывести все 6-ти значные числа, которые делятся без остатка на сумму своих цифр Вывести все 6-ти значные числа, которые делятся без остатка на сумму своих цифр. подсчитать кол-во Решаю ее в таком ключе, подскажите, пожалуйста, в каком месте ошибка и как изменить алгоритм решения? int sum=0, kol=0; for (int i=100000; i<=999999; i++) { if (i%sum==0) { http://www.cyberforum.ru/cpp-beginners/thread643468.html
Сложение разных типов C++
У меня из файла в переменную int считывется число.. Мне нужно занести в переменную string это число + строка. Например int i; string str; str = "STROKA" + i;
fflush(stdin) C++
В одной из ранее открытых тем, было сказано, что fllush(stdin) лучше не использовать. Чем можно заменить эту функцию?
C++ неправильность вызова qsort http://www.cyberforum.ru/cpp-beginners/thread643449.html
#include <iostream> #include <iomanip> using namespace std; struct User { int id; char nickname; int karma; };
C++ Массив Здравствуйте. Заранее прошу прощения, наверно вопрос баянистый. Пытался узнать длину массива таким способом: int lenght = sizeof(a)/sizeof(int);Здесь а - целочисленный массив. Дело в том, что в функции main длина вроде как считается, а вот если я массив передаю в функцию (например сортировки), там sizeof(a) почему то равен sizeof(int). Заинтересовавшись этим, я просмотрел реализованные... подробнее

Показать сообщение отдельно
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
28.08.2012, 15:17     Ошибка о повреждение кучи
Вот переделал программу со строками, с использованием классов.
Почему-то опять возникает ошибка о повреждение кучи. Не могу понять где она происходит. Уже всё пересмотрел. Если нетрудно посмотрить в чём может быть ошибка:

Вот код

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 минуту
Посдкажите, как привести программу к человеческому виду. Что исправить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru