我有一个名为bookStruct的结构化数据类型,books是与bookStruct数据类型关联的变量的名称.book [10]是一个长度为10个字符并且有4个字符数据的数组,这意味着book [0] to book [3]在其余为空(o值)时有数据.现在我想要打印数组中已有的数据而不打印那些空的数据,否则为0.我尝试了下面的代码,没有运气.我在这里做错了什么?
for (int i=0;i<MAX_BOOKS && books[i]!='\0';i++)
{
cout << "Book Title: " << books[i].bookTitle << endl;
cout << "Total Pages: " << books[i].bookPageN << endl;
cout << "Book Review: " << books[i].bookReview << endl;
cout << "Book Price: " << books[i].bookPrice<< "\n\n" << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是book结构的声明
struct bookStruct
{
string bookTitle;
int bookPageN;
int bookReview;
float bookPrice;
};
bookStruct books[10];
Run Code Online (Sandbox Code Playgroud)
Pet*_*ood 12
重载输出运算符.例如:
struct Book {
string title;
int pageN;
int review;
float price;
};
ostream& operator<<(ostream& os, const Book& book) {
return os << "Title: " << book.title << endl
<< "Pages: " << book.pageN << endl
<< "Review: " << book.review << endl
<< "Price:" << book.price << endl;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以输出到任何流:
Book book;
ostringstream oss;
oss << book;
Run Code Online (Sandbox Code Playgroud)
要遍历所有图书,复制到std::cout,只有当图书有标题时,您才需要std::copy_if:
bool bookHasTitle(const Book& book) {
return book.title.empty() == false;
}
Book books[10];
copy_if(books, books+10, ostream_iterator<Book>(cout, "\n"),
bookHasTitle);
Run Code Online (Sandbox Code Playgroud)
有点难以说出这里问的是什么。您看,计算您存储的图书数量非常容易:
int numBooks = 0;
Run Code Online (Sandbox Code Playgroud)
当您添加一本书时,您会增加numBooks直到MAX_BOOKS。
for( int i=0; i<numBooks; i++ ) ...
Run Code Online (Sandbox Code Playgroud)
如果您不想这样做,您当然无法测试books[i] != '\0',因为这是针对单个字符测试结构。
相反,您可能想测试books[i].bookTitle.size() != 0
(或者确实如此!books[i].bookTitle.empty())。
for( int i=0; i<MAX_BOOKS && !books[i].bookTitle.empty(); i++ ) ...
Run Code Online (Sandbox Code Playgroud)
另一种选择是将书籍存储在 avector而不是数组中,因此您不必担心最大计数和当前计数。该向量可以为您缩小和增长。
vector<bookStruct> books;
...
for( int i = 0; i < books.size(); i++ ) ...
Run Code Online (Sandbox Code Playgroud)