【问题标题】:how to access data by index如何通过索引访问数据
【发布时间】:2021-11-09 01:01:06
【问题描述】:

我是课程的初学者,我尝试制作一个没有文件处理的简单图书馆管理系统。所以我改用数组。但是当我尝试通过索引显示输入数据时(基本上,在添加书籍后输入数字 2 以调用 showBook()),它显示我随机数和其他为空。我不知道发生了什么。

#include <iostream>

using namespace std;
int p = 0;

void addBook();
void showBooks();

struct Library{
  string title[5], author[5];
  int isbn[5], price[5];
};

int main()
{
    while (true){
    cout << "\t\tLibrary Management Sytem\n";
    cout << "1. ADD BOOK.\n";
    cout << "2. SHOW BOOKS\n";
    cout << "Number: ";
    int x;
    cin >> x;
    
    switch(x){
        case 1:
        addBook();
        break;
        case 2:
        showBooks();
        break;
        default:
        cout << "Invalid input.";
    }
    };
    
    return 0;
}
void addBook(){
    Library lib;
    cout << "Enter Book title: ";
    getline(cin, lib.title[p]);
    cin.ignore(232, '\n');
    cout << "Enter The Author: ";
    getline(cin, lib.author[p]);
    cout << "Enter ISBN: ";
    cin >> lib.isbn[p];
    cout << "Enter price: ";
    cin >> lib.price[p];
    p++;
}

void showBooks(){
    Library lib;
    for (int i = 0; i < p; i++){
        cout << "Book: " << lib.title[i] << endl;
    cout << "Author: " << lib.author[i] << endl;
    cout << "ISBN: " << lib.isbn[i] << endl;
    cout << "Price: " << lib.price[i];
    }
    
}

【问题讨论】:

  • 注意:考虑一个结构数组,而不是一个充满数组的结构。这通常更容易管理。
  • 请注意,不要将p 设为全局变量,而是将其设为函数参数。混乱的可能性较小。您还应该给它一个描述性的名称。如果您的所有标识符都描述了它们的作用或表示的内容,那么代码实际上会自行组合。另外,很容易意外地交换pq,如果程序中有q,编译器可能会允许它。混乱随之而来。
  • cin.ignore(232, '\n'); 有点不知从何而来。您可能想与your Rubber Duck 讨论该行的目的。这可能是必要的,但我无法知道。只是看起来很奇怪。
  • @user4581301 老实说,我不知道 cin.ignore()。我刚在这里看到它,因为我们也有同样的问题,当被要求输入书名时它会跳过。 stackoverflow.com/questions/25475384/…
  • 为了防止你担心的问题ignore需要在最后一次使用&gt;&gt;之后才能读入数据。 &gt;&gt; 一旦找到空白就停止,换行符是空白,并将空白留在流中。你想忽略那个额外的空格,否则下一次对getline 的调用将立即找到换行符并退出而不读取任何有用的内容。不要将ignore 放在getline 之前,因为迟早你会找到一条通过代码的路径到达ignore 而没有你需要忽略的数据并结束ignoreing 你需要的数据。

标签: c++ arrays indexing


【解决方案1】:

我建议您创建一个 Book 类,每个类都有一个来自 Library 的成员。将Library 更改为Book 的集合,例如std::vector 或数组。并行数组(您在Library 中拥有的)可能会不同步。此外,通过拥有一个结构(或类)数组,您的元素在内存缓存中彼此相邻。否则author[0]会放在title[4]之后,author[0]可能不在数据缓存中,所以需要重新加载数据缓存。

struct Book
{
  std::string title;
  std::string author;
  std::string isbn;
  int         price;
};

typedef std::vector<Book> Library;

您可能希望重载operator&gt;&gt; 以从控制台输入Book

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2019-01-11
    • 2020-06-30
    • 1970-01-01
    • 2018-12-09
    • 2019-07-23
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多