如何在c ++中打印结构数组中的所有内容?

3 c++ struct

我有一个名为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)

  • 我不知道,经常看到正确的做事方式可以帮助你了解更大的情况.我不会乱用循环,因为我知道我弄错了.我尝试划分我的代码,以便我可以重用它.这些都是简单的课程,可以在您的编程生涯中积极应用.这就是我在所有答案中尝试做的事情,而不是被拖回旧的做事方式. (5认同)
  • +1但对于那些明显掌握基础知识的人来说,这可能会有点先进. (2认同)

pad*_*ddy 4

有点难以说出这里问的是什么。您看,计算您存储的图书数量非常容易:

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)