You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:18:31