C++图书馆管理项目getline()无法正常接收输入问题求助
问题根因
你遇到的现象是C++输入流的缓冲区残留导致的:cin >>在读取整数、浮点数等数值类型时,只会读取输入的数字部分,用户输入完成后按下回车产生的\n换行符会残留在输入缓冲区中。后续调用getline()时,会默认读取到换行符为止的内容,此时残留的换行符会被getline()当成一行空内容直接读取,因此看起来程序没有等待用户输入就直接跳转到下一个步骤。你写两次getline()的操作本质是第一次读取了空的换行残留,第二次才正常读取用户输入的内容。
解决方案
每次调用cin >>读取数值类数据后,手动清理输入缓冲区的残留内容即可,推荐使用更稳妥的全清理写法:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
这段代码会清空输入缓冲区中直到换行符为止的所有内容,避免多余空格、制表符等残留引发其他问题,使用该方法需要先引入头文件:
#include <limits>
具体修改点
针对你提供的代码,需要在3个位置添加缓冲区清理逻辑:
- 在
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');
- 在
library::add_Book函数中,最后一个cin >> b_copies;语句后添加清理代码,避免下一次添加图书时第一个getline()读取到残留换行:
cin >> b_copies; cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "\n";
- 在
show_book_list函数中,cin >> num;语句后添加清理代码,避免后续操作出现同类问题:
cin >> num; cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "\n";
修改完成后,你代码第22行注释掉的第二个getline()就可以删除,仅保留一次调用即可正常读取用户输入的书名。
内容的提问来源于stack exchange,提问作者Aditya Vaste
相关产品推荐
相关产品推荐

