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

How to print everything from an struct array in c++?

本文关键字:数组 结构 c++ 打印      更新时间:2023-10-16

我有一个结构化的数据类型,名为bookStruct,books是与bookStruct数据类型关联的变量的名称。book[10]是一个10个字符长的数组,有4个字符的数据,这意味着book[0]到book[3]中有数据,而其余数据为空(o值)。现在我想打印数组中已经可用的数据,而不是打印空的数据,否则为0。我尝试了下面的代码,但没有成功。我在这里做错了什么?

for (int i=0;i<MAX_BOOKS && books[i]!='';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<< "nn" << endl;
            }

这是图书结构的声明

struct bookStruct
{
    string bookTitle;
    int bookPageN;
    int bookReview;
    float bookPrice;
};
bookStruct books[10];

重载输出运算符。例如:

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

很难判断这里问的是什么。你看,只记下你储存了多少本书是很容易的:

int numBooks = 0;

添加书本时,将numBooks递增到MAX_BOOKS

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

如果您不想这样做,那么肯定不能测试books[i] != '',因为这是针对单个字符测试结构。

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

(或者实际上是!books[i].bookTitle.empty())。

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

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

vector<bookStruct> books;
...
for( int i = 0; i < books.size(); i++ ) ...
#include <iostream>
using namespace std;
struct bookStruct
{
    string bookTitle;
    int bookPageN;
    int bookReview;
    float bookPrice;
    void set(string t,int pn,int r,float pr){
        bookTitle = t;
        bookPageN = pn;
        bookReview = r;
        bookPrice = pr;
    }
};

ostream& operator << (ostream& os, const bookStruct& book)
{
   return os << "Title: " << book.bookTitle <<
              " Pages: " << book.bookPageN << 
               " Review: " << book.bookReview 
              << " Price:" << book.bookPrice << endl;
}
int main() { 
     bookStruct books[10];
     for(int i =0;i<10;i++){
         books[i].set("Book " + to_string(i),i*20,i,(float) i*54);
     }
     for(int i=0;i<10;i++){
         cout << books[i];
     }
    return 0;
}
Output:::
Title: Book 0 Pages: 0 Review: 0 Price:0
Title: Book 1 Pages: 20 Review: 1 Price:54
Title: Book 2 Pages: 40 Review: 2 Price:108
Title: Book 3 Pages: 60 Review: 3 Price:162
Title: Book 4 Pages: 80 Review: 4 Price:216
Title: Book 5 Pages: 100 Review: 5 Price:270
Title: Book 6 Pages: 120 Review: 6 Price:324
Title: Book 7 Pages: 140 Review: 7 Price:378
Title: Book 8 Pages: 160 Review: 8 Price:432
Title: Book 9 Pages: 180 Review: 9 Price:486