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