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())会导致最后多拼接一个空行,不过这个不是直接触发报错的原因。
修复方案
- 先缓存
find()的返回结果,明确判断是否找到目标子串后再执行对应逻辑 - 删除冗余的文件关闭操作
- 优化文件读取逻辑避免多读空行
修正后的代码如下:
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
相关产品推荐
相关产品推荐

