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

Правильное чтение символов в динам. массив - C++

Восстановить пароль Регистрация
 
tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
03.04.2013, 08:39     Правильное чтение символов в динам. массив #1
Ошибка скорей всего в синтаксисе. Если надо, могу и все исходники выложить
хэдэр
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Cow {
public:
    const static int lenght = 20;
    Cow ();
    Cow (const char * nm, const char * ho, double wt);
    Cow (const Cow & c);
    ~Cow ();
    Cow operator= (const Cow & c);
    void ShowCow ();
private:
    char name [lenght];
    char * hobby ;
    double weight;
};
конструкторы по умолчанию и не по умолчанию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Cow::Cow () {
    std::strcpy (name, "Default cow");
    char * hobby = new char [Cow::lenght];
    std::strcpy (hobby, "Do nothing");
    weight = 0;
};
Cow::Cow (const char * nm, const char * ho, double wt) {
    std::strcpy (name, nm );
    char * hobby = new char [Cow::lenght];
    std::strcpy (hobby, ho );
    weight = wt;
};
в мэине считывание происходит так
cout << "Hobby: ";
char * ho = new char [Cow::lenght];
cin.get (ho, Cow::lenght);
Отладчик VS 2012 говорит об ошибке
Миниатюры
Правильное чтение символов в динам. массив  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 08:39     Правильное чтение символов в динам. массив
Посмотрите здесь:

C++ Чтение символов с консоли
Чтение из файлов. Отсеивание символов C++
Чтение символов из файла C++
C++ Добавление элементов в динам. массив с последующей сортировкой
C++ Чтение символов из строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.04.2013, 11:23     Правильное чтение символов в динам. массив #2
tramp_1-3, закиньте все исходники. Не очень понятно в какой момент ошибка возникает.
P.S. оператор= должен возвращать ссылку (Cow&)
IrineK
03.04.2013, 12:35
  #3

Не по теме:

Отладчик английской орфографии тоже говорит об ошибке: исправьте lenght на length
На будущее: исходниками с такими ошибками никто не сможет воспользоваться и они превращаются в мусор даже при хорошем уровне разработки.

tramp_1-3
 Аватар для tramp_1-3
14 / 14 / 1
Регистрация: 13.10.2012
Сообщений: 428
04.04.2013, 11:23  [ТС]     Правильное чтение символов в динам. массив #4
Цитата Сообщение от Tulosba Посмотреть сообщение
tramp_1-3, закиньте все исходники. Не очень понятно в какой момент ошибка возникает.
P.S. оператор= должен возвращать ссылку (Cow&)
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
#include "cow.h"
#include <iostream>
void SomeFunc (Cow obj);
int main () {
    using std::cin;
    using std::cout;
    cout << "Cow's name: ";
    char * name = new char [Cow::length];
    cin.get (name, Cow::length);
    cin.ignore (1);
    cout << "Hobby: ";
    char * ho = new char [Cow::length];
    cin.get (ho, Cow::length);
    cout << "Weight: ";
    double weight;
    cin >> weight;
    Cow * first = new Cow (name, ho, weight);
    first->ShowCow ();
    cout << "Create another object by default\n";
    Cow second;
    second.ShowCow ();
    cout << "Assignment fist to second\n";
    second = *first;
    second.ShowCow ();
    cout << "Passing object by value\n";
    SomeFunc (second);
    system ("pause");
    delete [] ho;
    delete [] name;
    return 0;
};
void SomeFunc (Cow obj) {
    std::cout << "That's in function: \n";
    obj.ShowCow ();
};
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
#include "cow.h"
#include <iostream>
#include <cstring>
Cow::Cow () {
    std::strcpy (name, "Default cow");
    char * hobby = new char [Cow::length];
    std::strcpy (hobby, "Do nothing");
    weight = 0;
};
Cow::Cow (const char * nm, const char * ho, double wt) {
    std::strcpy (name, nm );
    char * hobby = new char [Cow::length];
    std::strcpy (hobby, ho );
    weight = wt;
};
Cow & Cow::operator= (const Cow & c) {
    if (this == &c) 
        return *this;
    std::strcpy (name, c.name);
    delete [] hobby;
    char * hobby = new char [Cow::length];
    std::strcpy (hobby, c.hobby);
    weight = c.weight;
    return *this;
};
Cow::Cow (const Cow & c) {
    std::strcpy (name, c.name);
    delete [] hobby;
    char * hobby = new char [Cow::length];
    std::strcpy (hobby, c.hobby);
    weight = c.weight;
};
Cow::~Cow () {
    name [0] = '\0';
    delete [] hobby;
    weight = 0;
};
void Cow::ShowCow () {
    std::cout << name << " likes " << *hobby << " and weights " << weight << '\n';
};
Добавлено через 1 минуту
Цитата Сообщение от tramp_1-3 Посмотреть сообщение
tramp_1-3, закиньте все исходники. Не очень понятно в какой момент ошибка возникает.
P.S. оператор= должен возвращать ссылку (Cow&)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Cow {
public:
    const static int length = 20;
    Cow ();
    Cow (const char * nm, const char * ho, double wt);
    Cow (const Cow & c);
    ~Cow ();
    Cow & operator= (const Cow & c);
    void ShowCow ();
private:
    char name [length];
    char * hobby ;
    double weight;
};
Добавлено через 5 минут
Цитата Сообщение от IrineK Посмотреть сообщение
На будущее: исходниками с такими ошибками никто не сможет воспользоваться и они превращаются в мусор даже при хорошем уровне разработки.
жаль, я думал что невинная буква режет глаз меньше, чем переменные под понятными и красноречивыми названиями Peremrnnaya100500 или Summa9000.

Добавлено через 18 минут
Ошибку нашел - в методах память под строки надо выделять так
C++
1
hobby = new char [Cow::length];
правда, другие вылезли

Добавлено через 22 часа 1 минуту
Если кому-то интересно, то вот полностью рабочие исходники:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
class Cow {
private:
    int length;
    char  name [20] ;
    char * hobby ;
    double weight;
public:
    Cow ();
    Cow (const char *, const char *, double);
    Cow (const Cow &);
    ~Cow ();
    Cow & operator= (const Cow &);
    friend std::ostream & operator << (std::ostream &, const Cow &);
};
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
#include "cow.h"
#include <cstring>
Cow::Cow () {
    strcpy (name, "Default cow");
    length = strlen ("Default action");
    hobby = new char [length + 1];
    strcpy (hobby, "Default action");   
    weight = 0;
};
Cow::Cow (const char  nm [], const char * ho, double wt) {
    std::strcpy (name, nm );
    length = strlen (ho);
    hobby = new char [length + 1];
    strcpy (hobby, ho );
    weight = wt;
};
Cow & Cow::operator= (const Cow & c) {
    if (this == &c) 
        return *this;
    strcpy (name, c.name);
    delete [] hobby;
    length = strlen (c.hobby);
    hobby = new char [length + 1];
    strcpy (hobby, c.hobby);
    weight = c.weight;
    return *this;
};
Cow::Cow (const Cow & c) {
    strcpy (name, c.name);
    length = strlen (c.hobby);
    hobby = new char [length + 1];
    strcpy (hobby, c.hobby);
    weight = c.weight;
};
Cow::~Cow () {
    name [0] = '\0';
    delete [] hobby;
    weight = 0;
};
std::ostream & operator << (std::ostream & os, const Cow & c) {
    std::cout << c.name << " likes ";
    for (int i = 0; i < c.length; i++)
        std::cout.put (c.hobby [i]);
    std::cout << " and weights " << c.weight << '\n';
    return os;
};
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
#include "cow.h"
#include <iostream>
void SomeFunc (Cow obj);
int main () {
    using std::cin;
    using std::cout;
    cout << "Cow's name: ";
    char * name = new char [20];
    cin.get (name, 20);
    cin.ignore (1);
    cout << "Hobby: ";
    char * ho = new char [20];
    cin.get (ho, 20);
    cout << "Weight: ";
    double weight;
    cin >> weight;
    Cow * first = new Cow (name, ho, weight);
    cout << *first;
    cout << "Create another object by default\n";
    Cow second;
    cout << second;
    cout << "Assignment fist to second\n";
    second = *first;
    cout << second;
    cout << "Passing object by value\n";
    SomeFunc (second);
    system ("pause");
    delete [] ho;
    delete [] name;
    delete first;
    return 0;
};
void SomeFunc (Cow obj) {
    std::cout << "That's in function: \n" << obj << '\n';
};
Yandex
Объявления
04.04.2013, 11:23     Правильное чтение символов в динам. массив
Ответ Создать тему
Опции темы

Текущее время: 19:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru