7

我有一个名为 bookStruct 的结构化数据类型,books 是与 bookStruct 数据类型关联的变量的名称。book[10] 是 10 个字符长的数组,包含 4 个字符的数据,这意味着当其余为空(o 值)时,book[0] 到 book [3] 中有数据。现在我想打印已经在数组中可用的数据,而不是打印那些为空的数据,否则为 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;
            }

这是书结构的声明

struct bookStruct
{
    string bookTitle;
    int bookPageN;
    int bookReview;
    float bookPrice;
};

bookStruct books[10];
4

2 回答 2

18

重载输出运算符。例如:

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;
}

然后你可以输出到任何流:

Book book;
ostringstream oss;
oss << book;

要遍历所有书籍,复制到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);
于 2013-02-04T21:49:42.493 回答
4

很难说这里问的是什么。你看,只计算你存储了多少本书是很容易的:

int numBooks = 0;

当您添加一本书时,您会递增numBooks直到MAX_BOOKS

for( int i=0; i<numBooks; i++ ) ...

如果你不想这样做,你当然不能测试books[i] != '\0',因为那是针对单个字符测试结构。

相反,您可能想要测试books[i].bookTitle.size() != 0

(或确实!books[i].bookTitle.empty())。

for( int i=0; i<MAX_BOOKS && !books[i].bookTitle.empty(); i++ ) ...

另一种选择是将书籍存储在 avector而不是数组中,因此您不必担心最大计数和当前计数。矢量可以为您缩小和增长。

vector<bookStruct> books;

...

for( int i = 0; i < books.size(); i++ ) ...
于 2013-02-04T21:24:57.950 回答