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

9
我有一个名为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;
            }

这是book结构体的声明。
struct bookStruct
{
    string bookTitle;
    int bookPageN;
    int bookReview;
    float bookPrice;
};

bookStruct books[10];

1
你能添加声明结构体的代码吗? - Tom Macdonald
4
为什么条件中要加入&& books[i]!='\0' - Tim
1
请解释一下 "with no luck" 是什么意思。它能编译吗?它会打印任何东西吗?如果是这样,会打印什么? - molbdnilo
@DrewDormann请检查我刚刚编辑的问题。 - user2017078
1
下面作为答案发布了一种更好的遍历数组的方法,你应该去看看。 - Tim
显示剩余9条评论
4个回答

21

重载输出运算符。例如:

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

2
+1 但是对于那些显然还在掌握基础知识的人来说,这可能有点高级。 - paddy
7
我不知道,通常看到正确的做法会帮助你看到更大的图景。我不会在循环中瞎搞,因为我知道我会弄错。我尝试将我的代码分隔开来,这样我就可以重复使用它。这些都是易学的简单经验,而且在编程职业生涯中需要积极应用。这就是我在回答问题时尝试做到的,而不是被拖回我以前的做法。 - Peter Wood

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++ ) ...

另一个选择是将书籍存储在 vector 中,而不是数组中,这样您就不必担心最大计数和当前计数。向量可以自动收缩和扩展。
vector<bookStruct> books;

...

for( int i = 0; i < books.size(); i++ ) ...

谢谢,第二个选项更方便。 - user2017078
根据这篇文章:http://eli.thegreenplace.net/2003/12/26/initialization-of-structures-and-arrays-in-c/,你可以将数组中的所有结构体初始化为0。 - Tom Macdonald
@ravloony 我认为这不相关,因为这个结构体不是 POD(里面有一个字符串)。利用字符串的默认构造函数应该就足够了。 - paddy

0
#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

0
使用友元函数来自定义打印功能。 然后只需在记录上触发一个循环。 使用C++20才能使用范围。
    struct bookStruct
    {
        std::string bookTitle;
        int bookPageN;
        int bookReview;
        float bookPrice;
    
        friend std::ostream& operator<<(std::ostream& os, const bookStruct& book)
        {
            if (!book.bookTitle.empty()) //Ensure title exists.
            {
                return os << std::endl << "Book Title: " << book.bookTitle << std::endl
                    << "Total Pages: " << book.bookPageN << std::endl
                    << "Book Review: " << book.bookReview << std::endl
                    << "Book Price: " << book.bookPrice << std::endl;
            }
            else
            {
                return os;
            }
        }
    };
    
    int main()
    {
        //Input - four records
        const std::vector<bookStruct> books{ {"book1",200,2,2000.00}, {"book2",400,4,4000.00},
                                             {"",0,0,0.0},{"",0,0,0.0} };
    
        std::ranges::for_each(books, [](auto book) {std::cout << book; });
    
        return 0;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接