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

C++图书馆管理项目getline()无法正常接收输入问题求助

问题根因

你遇到的现象是C++输入流的缓冲区残留导致的:
cin >>在读取整数、浮点数等数值类型时,只会读取输入的数字部分,用户输入完成后按下回车产生的\n换行符会残留在输入缓冲区中。后续调用getline()时,会默认读取到换行符为止的内容,此时残留的换行符会被getline()当成一行空内容直接读取,因此看起来程序没有等待用户输入就直接跳转到下一个步骤。你写两次getline()的操作本质是第一次读取了空的换行残留,第二次才正常读取用户输入的内容。

解决方案

每次调用cin >>读取数值类数据后,手动清理输入缓冲区的残留内容即可,推荐使用更稳妥的全清理写法:

cin.ignore(numeric_limits<streamsize>::max(), '\n');

这段代码会清空输入缓冲区中直到换行符为止的所有内容,避免多余空格、制表符等残留引发其他问题,使用该方法需要先引入头文件:

#include <limits>
具体修改点

针对你提供的代码,需要在3个位置添加缓冲区清理逻辑:

  1. 在main函数中,所有cin >> command;语句后添加清理代码,共2处:
// 初始输入command后
cout << "~ ";
cin >> command;
cin.ignore(numeric_limits<streamsize>::max(), '\n');

// 循环末尾输入command后
cout << "~ ";
cin >> command;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
  1. 在library::add_Book函数中,最后一个cin >> b_copies;语句后添加清理代码,避免下一次添加图书时第一个getline()读取到残留换行:
cin >> b_copies;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "\n";
  1. 在show_book_list函数中,cin >> num;语句后添加清理代码,避免后续操作出现同类问题:
cin >> num;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "\n";

修改完成后,你代码第22行注释掉的第二个getline()就可以删除,仅保留一次调用即可正常读取用户输入的书名。

内容的提问来源于stack exchange,提问作者Aditya Vaste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:54:02