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

C++图书管理系统调用!str.find()时抛出abort()调试错误求解

报错原因

  • 核心问题是对std::string::find()方法的返回值判断逻辑错误:find()方法找不到目标子串时会返回常量std::string::npos(本质是值为-1的无符号整数),而非0。当前代码的判断逻辑if (sTotal.find("NA"))会将「找不到NA(图书已借出)」的情况判定为真,错误进入替换分支。
  • 进入分支后再次调用find("NA")依然返回npos,将非法的位置参数传给replace()方法,触发标准库的异常抛出逻辑,没有被捕获的异常最终调用abort()终止程序,就是你看到的报错。
  • 额外不规范点:你在if分支内已经调用了checkOutBook.close(),分支外又重复调用了一次关闭操作,属于冗余的错误写法。
  • 次要问题:读文件时使用while (!checkBookList.eof())会导致最后多拼接一个空行,不过这个不是直接触发报错的原因。

修复方案

  1. 先缓存find()的返回结果,明确判断是否找到目标子串后再执行对应逻辑
  2. 删除冗余的文件关闭操作
  3. 优化文件读取逻辑避免多读空行

修正后的代码如下:

void bookCheckout()
{
    system("CLS");
    string line;
    string bookChoice;
    ifstream checkBookList;
    ofstream checkOutBook;
    checkBookList.open("books/booklist.txt");
    
    string sTotal;
    string s;

    cout << "<---Avaliable Books--->" << endl;
    while (getline(checkBookList, line)) {
        cout << line << endl;
    }
    checkBookList.close();

    cout << "\nWhat Book Would You Like?:";
    cin >> bookChoice;

    checkBookList.open("books/" + bookChoice + ".txt");
    // 优化读文件逻辑,避免eof判断导致的多读
    while (getline(checkBookList, s)) {
        sTotal += s + "\n";
    }
    checkBookList.close();

    // 先缓存find结果,明确判断是否找到NA
    size_t naPos = sTotal.find("NA");
    if (naPos != string::npos) {
        sTotal.replace(naPos, 2,  globalUsername);
        checkOutBook.open("books/" + bookChoice + ".txt", ios::trunc);
        checkOutBook << sTotal;
        checkOutBook.close();
    } else {
        cout << "Book already checked out!" << endl;
    }
    
    system("PAUSE");
}

内容的提问来源于stack exchange,提问作者Ryan Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:48:04