Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
#1

Работа со строками и выделением памяти - C++

29.03.2013, 00:27. Просмотров 517. Ответов 13
Метки нет (Все метки)

Задание написать класс строк (что-то типа String).

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
#define MAX 100
class ascii {
private:
    char* str[MAX];
    int len;
public:
    ascii(const char*);
    ~ascii();
    void Insert(int, ascii);
};
 
ascii::~ascii() {
    for(int i=0; i<=len; i++) delete str[i];
}
 
ascii::ascii(const char* in) {
    int i=0;
    while(in[i]) {
    str[i]=new char;
    *str[i]=in[i];
    i++;
    }
    len=i;
    str[len]=new char;
    str[len]='\0';
}
 
int ascii::length() {
    return len;
}
 
void ascii::show() {
    for(int i=0; i<len; i++) printf("%c",*str[i]);
}
 
void ascii::Insert(int pos, ascii A) {
    int oldlen=len;
    for(int i=0; i<A.len; i++) {
    str[i+oldlen+1]=new char;
    len++;
    }
    for(int i=0; i<A.len+1; i++) 
        str[A.len+oldlen-i]=str[oldlen-i];
    int k=0;
    for(int i=0; i<A.len; i++) 
        str[i+pos]=A.str[k++];
 
 
}
Дело в том что при работе функции Insert, программа работает неадекватно. Выдает ошибку http://www.valar.ru/gallery/0313/z.png
Что-то с динамическим выделением памяти...

Не знаю как правильно организовать все это с динамической памятью...
http://www.cyberforum.ru/cpp-beginners/thread349151.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 00:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа со строками и выделением памяти (C++):

Конструктор с выделением памяти
Среди всех данных есть указатель, память для которого выделяется в...

ошибка с выделением памяти
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача...

Проблемы с выделением памяти
Здравствуйте. Есть контейнер QList &lt;Node *&gt; В Node свой QList &lt;Node *&gt;. ...

Строки с выделением динамической памяти
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить...

Задача на строки с выделением памяти
Добрый вечер, помогите с задачкой Выводит на экран только строки, состоящие из...

13
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.03.2013, 02:49 #2
Объект класса ascii - строка? Зачем там массив указателей на char?

Добавлено через 16 минут
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
class ascii 
{
    char* str;
    int len;
public:
    ascii(const char*);
    ~ascii();
    void Insert(int, ascii&);
    void show();
    int length();
};
 
ascii::~ascii() 
{
    delete [] str;
}
 
ascii::ascii(const char* in) 
{
    len = strlen(in);
    str = new char[len + 1];
    int i = 0, j = 0;
    while (str[i++] = in[j++]);
}
 
int ascii::length() 
{
    return len;
}
 
void ascii::show() 
{
    printf("%s", str);
}
 
void ascii::Insert(int pos, ascii &A) 
{
    len = len + A.len;
    char *p = new char[len + 1];
    
    int i;
    for (i = 0; i < pos; ++i)
        p[i] = str[i];
    
    int j = 0;
    while (A.str[j])
        p[i++] = A.str[j++];
    
    while (p[i++] = str[pos++]);
    
    delete [] str;
    str = p;
}
1
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 00:47  [ТС] #3
Спасибо, вроде бы разобрался. Однако есть один вопрос.
Я хочу сделать
C++
1
Insert(int,char*)
Я пытаюсь сделать его так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void ascii::Insert(int pos, char *in) {
    int pos2=pos;
    ascii a(in);
    this->Insert(pos2,a);
}
 
ascii::ascii(char *in) {
    len=0;
    while(in[len++]);
    str = new char[len+1];
    for(int i=0; i<len; i++)
    str[i]=in[i];
}
в 50% случаев выдает ошибку, в остальных случаях нормально работает. Почему так?
Сначала хотел написать
C++
1
2
3
void ascii::Insert(int pos, char *in) {
    this->Insert(pos,ascii(in));
}
но Так ругается еще на стадии компилирования.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 01:35 #4
Цитата Сообщение от Hellko Посмотреть сообщение
в 50% случаев выдает ошибку
Какую? Тут len неверный будет:
Цитата Сообщение от Hellko Посмотреть сообщение
C++
1
2
3
4
5
6
7
ascii::ascii(char *in) {
 len=0;
 while(in[len++]);
 str = new char[len+1];
 for(int i=0; i<len; i++)
 str[i]=in[i];
}
0
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 01:38  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Какую? Тут len неверный будет:
Ошибка уже в процессе выполнения программы, win7 просто предлагает закрыть программу, не говорит что за ошибка.
Заметил что иногда вылазят левые символы - типа всякие названия, т.е. данные берет откуда-то не оттуда.
len проверил, вроде бы верный.
пожалуй да. Исправил на
C++
1
while(in[++len]);
теперь верный
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 01:47 #6
Цитата Сообщение от Hellko Посмотреть сообщение
Исправил
А здесь так исправили?
C++
1
 for(int i=0; i<len + 1; i++)
1
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 01:52  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
А здесь так исправили?
C++
1
 for(int i=0; i<len + 1; i++)
Да. Выдает верный ответ, но программа завершается так же: с ошибкой.
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 01:55 #8
Весь код покажите.

Добавлено через 58 секунд
Место, где ошибка происходит, определили?
1
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 02:15  [ТС] #9
С ошибкой я разобрался. Компилятор ругался на присваивания в сравнении. Я хотел переделать, но переделал криво.
Спасибо за помощь
Но вопрос по перегруженой функции все же остался. Мне кажется что такой вариант какой-то не совсем верный.
C++
1
2
3
4
5
void ascii::Insert(int pos, const char *in) {
    int pos2=pos;
    ascii a(in);
    this->Insert(pos2,a);
}
Почему нельзя просто сделать так?:
C++
1
2
oid ascii::Insert(int pos, const char *in) {
    this->Insert(pos,ascii(in));
Код
ошибка: no matching function for call to 'ascii::Insert(int&, ascii)'
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 02:59 #10
Цитата Сообщение от Hellko Посмотреть сообщение
Почему нельзя просто сделать так?:
Можно и так. А ошибку, возможно, показывает из-за того, что у вас константность в прототипе и реализации (функции или конструктора) не совпадают. Вы то так напишите, то так... А в прототипах забываете сменить константность. Проверьте соответствие...

Добавлено через 2 минуты
Хотя лучше не делать создание объекта в параметрах метода.
В какой среде делаете?

Добавлено через 5 минут
У меня (студия 10) такой код проходит без ошибок.
0
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 03:05  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня (студия 10) такой код проходит без ошибок.
В Qt4. В студии 08 проверил - работает.

Добавлено через 24 секунды
Странно что qt ругается..
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 04:02 #12
Второй метод Insert как сделан?

Добавлено через 22 минуты
Цитата Сообщение от Hellko Посмотреть сообщение
В студии 08 проверил - работает.
Добавлено через 24 секунды
Странно что qt ругается..
Не все компиляторы пропускают. Студия пропускает, mingv нет.

Добавлено через 23 минуты
Тут, в параметрах метода, создаётся безымянный временный объект, который должен быть передан в функцию по ссылке. Вообще, в классах, содержащих в полях указатели, нужно, во избежание проблем, определять конструкторы копирования и присваивания. Если бы здесь был определён конструктор копирования (для глубокого копирования), то можно было бы передавать объект в метод не по ссылке, а по значению. Тогда эта конструкция везде нормально работала бы.
1
Hellko
6 / 6 / 2
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 08:10  [ТС] #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Второй метод Insert как сделан?

Добавлено через 22 минуты

Не все компиляторы пропускают. Студия пропускает, mingv нет.

Добавлено через 23 минуты
Тут, в параметрах метода, создаётся безымянный временный объект, который должен быть передан в функцию по ссылке. Вообще, в классах, содержащих в полях указатели, нужно, во избежание проблем, определять конструкторы копирования и присваивания. Если бы здесь был определён конструктор копирования (для глубокого копирования), то можно было бы передавать объект в метод не по ссылке, а по значению. Тогда эта конструкция везде нормально работала бы.
Правильно ли я определил конструктор копирования?:
C++
1
2
3
4
ascii::ascii(const ascii &in) {
    len=in.len;
    str=in.str;
}
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 18:35 #14
Цитата Сообщение от Hellko Посмотреть сообщение
Правильно ли я определил конструктор копирования?:
Нет. Так, как раз, работает конструктор копирования, заданный по умолчанию, из-за чего и проблемы. Просто копирует поля. Для указателей это будет неправильно. Нужно скопировать не сам указатель, а то на что он указывает.
Должно быть что-то подобное констуктору, который принимает указатель на строку.
0
30.03.2013, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 18:35
Привет! Вот еще темы с решениями:

Ошибка в коде с выделением памяти
Не могу понять, в чем проблема? double** FuzzySet::operator&amp;&amp;(FuzzySet*...

Отличие операции с выделением памяти и без
Всем привет! Не сочтите за глупость, но возник интересный вопрос, над...

Динамическое выделением памяти для массивов
Даны три массива вещественных чисел X(25), B(30), Y(25). Из исходных массивов ...

Упорядочите члены в массиве с выделением памяти
Упорядочите отрицательные члены массива S(10) в порядке убывания, а...


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

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

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