C++图书馆管理系统按索引访问数据出现随机值和空内容如何解决
问题原因
核心问题出在变量作用域和输入处理逻辑上:
- 你在
addBook()和showBooks()函数内部都单独定义了Library lib对象,这两个是存储在栈区的独立临时变量,addBook()执行结束后该函数内的lib对象就会被销毁,写入的数据不会留存。showBooks()里新创建的lib对象没有被赋值过,成员都是未初始化状态,所以输出随机数字和空字段。 - 选择菜单时执行的
cin >> x会在输入缓冲区留下换行符,后续第一个getline会直接读取这个换行符得到空字符串,你当前把cin.ignore放在getline之后,位置错误。
修复方案
- 将Library存储实例调整为全局变量,保证两个函数操作的是同一个存储对象,数据可以跨函数留存
- 调整
cin.ignore的位置到菜单输入之后,清空缓冲区残留的换行符 - 可选优化:将结构体调整为单本书的结构,再用数组存储多本图书,逻辑更清晰,同时增加边界校验避免数组越界
修复后完整代码如下:
#include <iostream> using namespace std; int p = 0; struct Book{ string title; string author; int isbn; int price; }; Book lib[5]; // 全局图书数组,最多存储5本图书 void addBook(); void showBooks(); 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; cin.ignore(232, '\n'); // 清空输入缓冲区残留的换行符 switch(x){ case 1: addBook(); break; case 2: showBooks(); break; default: cout << "Invalid input.\n"; } } return 0; } void addBook(){ if(p >= 5){ cout << "图书库容量已满,无法新增\n"; return; } cout << "Enter Book title: "; getline(cin, lib[p].title); cout << "Enter The Author: "; getline(cin, lib[p].author); cout << "Enter ISBN: "; cin >> lib[p].isbn; cout << "Enter price: "; cin >> lib[p].price; p++; cout << "图书添加成功\n"; } void showBooks(){ if(p == 0){ cout << "暂无录入的图书数据\n"; return; } for (int i = 0; i < p; i++){ cout << "===== 第" << i+1 << "本图书信息 =====\n"; cout << "Book: " << lib[i].title << endl; cout << "Author: " << lib[i].author << endl; cout << "ISBN: " << lib[i].isbn << endl; cout << "Price: " << lib[i].price << endl; } }
内容的提问来源于stack exchange,提问作者equinox_xy
相关产品推荐
相关产品推荐

