2014-10-15 2 views
0

Я настоящий начинающий C++, и у меня есть проблема с выходом моего массива char в excelise C++. Меня попросили преобразовать определенный класс UML в C++ и создать рабочий вывод с параметрами, указанными в main. Здесь ист код:C++ char array output в функциях класса

#include <iostream> 
#include <stdlib.h> 


/*My class defintion book*/ 

class Book 
{ protected: 
     long int number; 
     char author[25]; 
     int year; 
     bool lent; 

     void setLent(bool x); 
     bool getLent(); 
    public: 
     Book(long int n, char a[25], int j, bool x); 
     long int getNr(); 
     int getYear(); 
     void print(); 
     }; 
/*Method definition Book*/ 
Book::Book(long int n, char a[25], int j, bool x) 
    {number=n; 
    author=a; 
    year=j; 
    lent=x;} 

long int Book::getNr() 
    {return number; } 

int Book::getYear() 
    {return year;} 

void Book::setLent(bool x) 
    {lent=x;} 

bool Book::getLent() 
    {return lent;} 

void Book::print() 
    { 
    std::cout << "Book Nr: " << number << std::endl; 
    std::cout << "Author: " << author << std::endl; 
    std::cout << "Year: " << year << std::endl; 
    if (lent==0) 
    std::cout << "Lent [yes/no]: no" << std::endl; 
    else 
    std::cout << "Lent [yes/no]: yes" << std::endl; 
    } 

/*MAIN*/ 

int main() 
{ 
Book b1(123456, "test", 2014, false); 

b1.print(); 

system("pause"); 
return 0; 

Это мой выход:

Book Nr: 123456 
Author: b<Vv-[[vóYA 
Year: 2014 
Lent [yes/no]: no 
Press any key to continue... 

Как вы можете видеть все выходы работают на «Автор», за исключением. Там я получаю дерьмо. Обратите внимание, что я должен использовать char как тип. поскольку он задан в классе UML, мне пришлось преобразовать его в C++.

Я действительно искал везде. Но не нашел правильного решения. У меня такое ощущение, что это будет очень просто ...

Заранее благодарим за вашу помощь!

+0

'author = a;' <- эта строка в вашем конструкторе не делает то, что вы думаете. Почему вы не используете 'std :: string'? – cdhowie

ответ

1

Причина этого не работает в том, что вы присваиваете свой указательauthorна другой указательa, который затем выходит за рамки ... поэтому у вас осталось author, указывающее на какой-то мусор. Если вы хотите придерживаться символьных массивов, вам придется скопировать все данные, которые a указывает на:

strcpy(author, a);  

Но так как это C++, вы должны использовать только строки, которые легче иметь дело с:

class Book { 
    ... 
    std::string author; 
    .... 
}; 

Book::Book(long int n, const std::string& a, int j, bool x) 
: author(a), ... 
{ } 
+0

На самом деле 'author' не является указателем, это реальный массив ... – cdhowie

+0

О, это массив? Как это тогда компилируется? – Barry

+0

@Barry: Вам лучше использовать 'strncpy (автор, a, 25);' и мой g ++ (версия: (Debian 4.4.5-8) 4.4.5) не скомпилировал исходный код из вопросителя: ' original.cpp: 25: ошибка: несовместимые типы при присвоении 'char *' to 'char [25]' ' – SDwarfs

1

Вы распечатываете неинициализированные данные.

Сделать автор строка

#include <string> 
class Book 
{ protected: 
     long int number; 
     std::string author; 
     int year; 
     bool lent; 

и сделать аргумент конструктора строку, а

Book::Book(long int n, const std::string& a, int j, bool x) 

Массивы символов не столь гибки, как STD :: строки. они просто куски данных. Если вы хотите использовать строки, используйте вместо этого std::string.

Кроме того, используйте список инициализации в C++ конструкторов, а не Java стиля

Book::Book(long int n, const std::string &a, int j, bool x) 
    : number(n), 
    author(a), 
    year(j), 
    lent(x) 
{ } 
+0

Еще лучше, сделайте аргумент 'std :: string const & a' (если вы не собираетесь перемещать-конструкцию' Book :: author' из него). – cdhowie

+0

@cdhowie хорошая точка, обновлено. –

+0

@Ryan: Я не знаю, является ли изменение с char [25] на std :: string. Это может быть проблемой, если UML говорит «char [25]». Но если это не так, использование std :: string - это, конечно, гораздо лучший стиль и менее склонный к ошибкам! – SDwarfs

0

есть две ошибки в коде:

Book::Book(long int n, const char a[25], int j, bool x) 
{ 
    number=n; 
    strncpy(author, a, 25); // author = a; doesn't work! shouldn't compile either... 
    year=j; 
    lent=x; 
} 

Первое: переменная автор представляет собой указатель на оканчивающуюся ул нулевой ING. Вы можете использовать strcpy() для копирования этой строки. Поэтому вам нужно #include <memory.h. Но вы должны быть уверены, что строка - действительно нулевая и вписывается в вашу целевую переменную! Кроме того, вы будете перезаписывать другие области памяти рядом с целевой переменной, которая также называется переполнением буфера! Лучше использовать strncpy (target, source, maxlength); что позволяет избежать этой проблемы.

Второе: Ваш параметр а должен быть «Уст», как вы хотите, чтобы быть в состоянии назвать ее строковой константой, как в Book b1(123456, "test", 2014, false); где "test" является постоянным!

Как уже было предложено, вы должны использовать std::string вместо a[25]. C-строки - это «C», а не «C++», и вы должны стараться избегать их. C-Strings могут ввести много ошибок в ваш код и включить переполнение буфера (= проблемы с безопасностью). Кроме того, они сложнее обрабатывать. Для их использования необходимо использовать #include <string>.

+1

Вы имеете в виду strncpy (автор, a, 25) справа? – Barry

+0

Да! Уже исправлено. Спасибо за заботу ;-) – SDwarfs

+0

strcpy отлично работает. 1000000 спасибо! – Martine