Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
zhenya.ya
1 / 1 / 2
Регистрация: 29.11.2009
Сообщений: 305
#1

Сложение двух строк

06.03.2011, 18:11. Просмотров 3225. Ответов 14
Метки нет (Все метки)

Проблема: не могу получть результат. Что у меня не так?

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
class base
{
private:
    char* str;
    int size;
public:
    base( char *str1) 
    { 
        size = strlen(str1);
        str = new char[size+1];
        strcpy(str,str1); 
    }
    ~base()
    {
        size = 0; delete[] str;
    }
        void print() { cout<<str<<endl;}
    base operator + (base bs);
};
 
base base::operator +(base bs)
{
    base result ("            ");
    int length;
    strcpy(result.str,bs.str);
    length = strlen(bs.str);
    memcpy(result.str,str+length,strlen(str));
    result.size= strlen(result.str)+1;
    result.str[result.size] = '\0';
    return (result);
}
 
void main()
{
    base obj1("111"),obj2("222"),obj3("                      ");
    obj3 = obj1 + obj2;
    obj3.print();
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 18:11
Ответы с готовыми решениями:

Сложение двух строк
вот написал что то вроде так... но не получается... что дополнить или изменить?...

Сложение двух строк
Добрый вечер. Написал программу, которая переводит два числа из десятичной в...

Сложение двух строк, ошибки
Подскажите пожалуйста где я допустил ошибки, всё никак программа не заработает....

Сделать сложение двух строк
Всем привет. Бьюсь об задачу. Есть два символьных массива с литералами. На...

Конкатенация двух нибблов (сложение двух полубайт в байт)
Как из этих двух полубайт получить полноценный байт со значение &quot;0x3e&quot;?...

14
IrineK
Заблокирован
06.03.2011, 19:38 #2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вот так сумма получается:

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
class base
{
private:
        char* str;
        int size;
public:
    base() {};
    base(char *str1) 
        { 
                size = strlen(str1);
                str = new char[size+1];
                strcpy(str,str1); 
        }
        ~base(){}
        void print() { cout<<str<<endl;}
        base operator + (base bs);
};
 
base base::operator +(base bs)
{
        strcat(str,bs.str);
        size= strlen(str);
        return (str);
}
 
void main()
{
    char obj1[80],obj2[80];
    cout<<"Input two lines\n";
    cin.getline(obj1,80);
    cin.getline(obj2,80);
    base s1(obj1),s2(obj2);
    s1.print();
    base s3;
    s3 = s1 + s2;
        s3.print();
    
    system("pause");
}
0
zhenya.ya
1 / 1 / 2
Регистрация: 29.11.2009
Сообщений: 305
06.03.2011, 20:13  [ТС] #3
Даже и так не работает и base s3; (тут ругается на отсутствие конструктора по умолчанию).
0
IrineK
Заблокирован
06.03.2011, 21:12 #4
Вы четко код скопипастили. Там же есть конструктор по умолчанию:
C++
1
base() {};
Пожалуйста, сделайте творчески ^C ^V, а потом уже разбирайтесь.
0
zhenya.ya
1 / 1 / 2
Регистрация: 29.11.2009
Сообщений: 305
06.03.2011, 22:07  [ТС] #5
У меня и с констуктором по умолчанию не работает. Вы же не думаете , что я бы не догадался попробывать его добавить
0
IrineK
Заблокирован
06.03.2011, 22:27 #6
А еще изменились: дестуктор и перегрузка плюса.
0
zhenya.ya
1 / 1 / 2
Регистрация: 29.11.2009
Сообщений: 305
06.03.2011, 22:34  [ТС] #7
Вот!, а на дестр. я то и не обратил внимания. А не могли бы Вы пояснить почему он долже быть именно таким ??
0
IrineK
Заблокирован
06.03.2011, 22:38 #8
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Дополнительно стараться не нужно.
1
easybudda
Модератор
Эксперт CЭксперт С++
10054 / 5974 / 1493
Регистрация: 25.07.2009
Сообщений: 11,321
07.03.2011, 02:12 #9
Цитата Сообщение от IrineK Посмотреть сообщение
Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Дополнительно стараться не нужно.
Вот в деструкторе крайне не помешало бы что-то вроде
C++
1
2
3
4
...
if ( str )
  delete [] str;
...
1
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
07.03.2011, 02:27 #10
Применение delete[] к нулевому указателю абсолютно безопасно. if здесь не нужен. А вот реализовать конструктор копий, и operator= очень бы не помешало.
0
zhenya.ya
1 / 1 / 2
Регистрация: 29.11.2009
Сообщений: 305
08.03.2011, 01:37  [ТС] #11
А у меня не работает если в деструтор забить это. Почему же так?
0
IrineK
Заблокирован
08.03.2011, 03:59 #12
У Праты (глава 11) написано:

delete применять в деструкторе, если new применяется в конструкторе.
Следить, чтобы все конструкторы были совместимы с деструкторами.
Логично.
1
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
08.03.2011, 09:43 #13
Цитата Сообщение от zhenya.ya Посмотреть сообщение
А у меня не работает если в деструтор забить это. Почему же так?
Цитата Сообщение от rangerx Посмотреть сообщение
А вот реализовать конструктор копий, и operator= очень бы не помешало.
.....
1
zhenya.ya
1 / 1 / 2
Регистрация: 29.11.2009
Сообщений: 305
08.03.2011, 15:39  [ТС] #14
Я попробывал подкорректировать ... насколько неправильно и что?
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
class base
{
private:
    char* str;
    int size;
public:
    base(){size = 0; str = 0;}
    base( char *str1) 
    { 
        size = strlen(str1);
        str = new char[size+1];
        strcpy(str,str1); 
    }
    base (const base &bs3);
    ~base()
    {
        if(str)
        delete []str;
    }
        void print() { cout<<str<<endl;}
    base operator + (base bs);
    base operator = (base bs1);
};
 
base base::operator +(base bs)
{
    strcat(str,bs.str);
    size = strlen(str);
    return (str);
}
base base::operator =(base bs1)
{
    size = bs1.size;
    str = bs1.str;
    return (str);
}
base::base(const base &bs3)
{
    size = bs3.size;
    str = new char [ bs3.size ];
    strcpy(str,bs3.str);
}
int main()
{
    char obj1[80],obj2[80];
    try
    {
    cout<<" input:"<<endl;
    cin>>obj1;
    cin>>obj2;
    if(strlen(obj1) >10 || strlen(obj2) >10) throw err("\n leave for boards\n");
    }
catch(err ob)
{
    ob.get_error();
}
base s1(obj1),s2(obj2);
base s3;
    s3 =s1+s2;
    s3.print();
    
    system("pause");
    return 0;
}
0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
09.03.2011, 01:24 #15
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <iostream>
#include <cstring>
 
class base
{
    private:
        size_t size_;
        char* data_;
 
    public:
        base()
            : size_(0),
              data_(0)
        {
        }
 
        base(const char* s)
            : size_( strlen(s) ),
              data_(new char[size_ + 1])
        {
            strcpy(data_, s);
        }
 
        base(const base& rhs)
            : size_(rhs.size_),
              data_(new char[size_ + 1])
        {
            strcpy(data_, rhs.data_);
        }
 
        ~base()
        {
            delete[] data_;
        }
 
        void print() const
        {
            std::cout << data_ << std::endl;
        }
 
        const base operator+(const base& rhs) const
        {
            base t;
            t.size_ = size_ + rhs.size_;
            t.data_ = new char[t.size_ + 1];
 
            strcpy(t.data_, data_);
            strcat(t.data_, rhs.data_);
 
            return t;
        }
 
        base& operator=(const base& rhs)
        {
            if(this != &rhs)
            {
                if(size_ != rhs.size_)
                {
                    delete[] data_;
                    size_ = rhs.size_;
                    data_ = new char[rhs.size_ + 1];
                }
 
                strcpy(data_, rhs.data_);
            }
 
            return *this;
        }
};
 
int main()
{
    base b1 = "text1";
    b1.print();
 
    base b2 = "text2";
    b2.print();
 
    base b3(b1 + b2);
    b3.print();
 
    base b4;
    b4 = (b1 + b2 + b3);
    b4.print();
 
    return 0;
}
1
09.03.2011, 01:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2011, 01:24

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

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

Сложение строк
Правильно ли я выполнил сложение строк? выдаёт ошибку что-то #include...


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

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

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