我是一个真正的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 ++。
我到处搜寻。但没有找到正确的解决方案。我觉得这将是一个非常简单的...
提前感谢您的帮助!
答案 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>
才能使用它们。