C++数组实现图书管理系统 bookName仅输出最后输入值问题求解
问题原因
代码存在4个核心逻辑错误,直接导致旧录入数据丢失:
- 数组写入下标每次被重置:添加图书分支里写了无意义的
for(i=0; i<10; i++)循环,进入循环第一行就执行break,相当于每次添加新书都把i固定为0,所有新录入的内容都直接覆盖数组第0位的旧数据,之前存的内容根本没有被保存到新的数组位置。 - 没有维护已存图书的计数:没有独立变量记录当前已经存了多少本图书,变量
i既没有初始化,也没有在每次添加图书后递增,无法定位新数据的写入位置,也无法确定遍历展示的边界。 - 遍历展示逻辑越界/漏读:查看图书列表时循环条件写为
x<=i,既没有对应实际存储的图书数量,还会因为i值不确定出现数组越界访问,自然读不到之前的录入内容。 - 输入流清理位置错误:
cin.ignore()只在添加分支调用,多次主循环后输入缓冲区残留的换行符会导致getline直接读取空内容,录入逻辑异常。
修复方案
按以下逻辑调整代码即可:
- 新增独立的图书计数变量
bookCount,初始值设为0,每次成功添加一本图书后计数+1,新图书统一写入bookCount对应的数组下标位置。 - 删除无意义的for循环,录入图书名称、作者、ID时直接使用当前计数值作为数组下标。
- 调整
cin.ignore()的调用位置,在所有getline读取输入前执行,清理缓冲区残留的换行符。 - 修正展示逻辑的循环边界,从下标0遍历到
bookCount-1的位置,补全输出格式,增加换行和作者、ID字段的展示。
修复后的完整可运行代码:
#include<iostream> using namespace std; int main(){ char yesNo; string bookName[50]; string bookAuthor[50]; string bookID[50]; int choice; int bookCount = 0; // 记录已存储的图书总数,初始为0 do{ cout << "==========================" << endl; cout << "LIBRARY MANAGEMENT SYSTEM" << endl; cout << "==========================" << endl; cout << "[1] Add Books" << endl; cout << "[2] Delete Books" << endl; cout << "[3] Search Books" << endl; cout << "[4] View Book List" << endl; cout << "[5] Close Application" << endl; cout<<"Enter a number: "; cin>>choice; switch(choice){ case 1: if(bookCount >= 50){ cout << "Book storage is full!" << endl; break; } cin.ignore(); // 读取前清理缓冲区换行 cout<<"Enter book name: "; getline(cin, bookName[bookCount]); cout<<"Enter book author: "; getline(cin, bookAuthor[bookCount]); cout<<"Enter book ID: "; getline(cin, bookID[bookCount]); bookCount++; // 录入成功后计数+1 cout<<"Book successfully added!"<<endl; break; case 4: cout<<"All Books"<<endl; for(int x=0; x < bookCount; x++){ cout << "Book ID: " << bookID[x] << endl; cout << "Book Name: " << bookName[x] << endl; cout << "Book Author: " << bookAuthor[x] << endl; cout << "--------------------------" << endl; } break; case 5: yesNo = 'N'; continue; default: cout << "Invalid choice, please input again!" << endl; } if(choice !=5){ cout<<"Do you want to continue (Y/N)"; cin>>yesNo; } }while (yesNo == 'y' || yesNo == 'Y'); cout<<"Thank You!"; return 0; }
额外说明:修复后的代码增加了存储上限判断、非法输入提示、退出选项的直接处理逻辑,避免出现数组越界、空循环的问题。
内容的提问来源于stack exchange,提问作者Azazel
相关产品推荐
相关产品推荐

