类函数中的c ++ char数组输出

时间:2014-10-15 22:01:16

标签: c++ arrays char output cout

我是一个真正的c ++初学者,我的c ++ excerise中的char数组输出有问题。我被要求将某个UML类转换为c ++,并使用main中给出的参数生成一个工作输出。这是代码:

#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 ++。

我到处搜寻。但没有找到正确的解决方案。我觉得这将是一个非常简单的...

提前感谢您的帮助!

3 个答案:

答案 0 :(得分: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 :: strings灵活。它们只是大块的数据。如果您想使用字符串,请改用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)
{ }

答案 1 :(得分: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), ...
{ }

答案 2 :(得分: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;
}

第一个:变量author是指向零终止字符串的指针。您可以使用strcpy()复制此字符串。因此,您需要#include <memory.h。但是你需要确保字符串-is-真的是零终止并且适合你的目标变量!否则,您将覆盖目标变量旁边的其他内存区域,这也称为缓冲区溢出!更好地使用strncpy(target,source,maxlength);这避免了这个问题。

第二个:您的参数a应为“const”,因为您希望能够使用字符串常量调用它,例如Book b1(123456, "test", 2014, false); "test"是常量!

正如其他人已经建议您使用std::string代替a[25]。 C-Strings是“C”而不是“C ++”,你应该尽量避免使用它们。 C-Strings可能会在代码中引入大量错误并启用缓冲区溢出(=安全问题)。它们也更复杂。您需要#include <string>才能使用它们。