C++程序跳过第二组输入直接执行后续计算该如何修复?
问题说明
这不是C++的特有特性,属于行缓冲输入机制的通用表现,几乎所有带标准输入缓冲的编程语言都会出现同类问题。
你当前代码的读取逻辑存在缺陷:你输入的时间格式为HH:MM xm(例如10:45 am),第一组输入读取时:
cin >> startHours读取到小时数cin >> extra读取到冒号cin >> startMinutes读取到分钟数cin >> amPmChar默认跳过前置空格后,只会读取am/pm的第一个字符,剩下的m和你输入完第一行按下的换行符会残留在输入缓冲区中
当执行到第二组输入读取时,cin >> endHours要读取int类型数据,但缓冲区第一个残留字符是m,不属于合法数字,cin直接进入失败状态,后续所有输入操作都会被跳过,就出现了你观察到的不接收第二组输入直接执行后续逻辑的现象。
修复方案
方案1:清空输入缓冲区残留
每次读取完第一组时间后,清空当前输入行的所有残留字符。
需要先引入头文件:
#include <limits>
在第一组的startIsAM赋值语句后添加清空缓冲区代码:
// 清空当前行所有残留字符,直到遇到换行符为止 cin.ignore(numeric_limits<streamsize>::max(), '\n');
方案2:完整读取am/pm标识
不要只读取单个字符,改为读取完整的am/pm字符串,避免残留。
将char amPmChar改为长度为3的字符数组(兼容字符串末尾的'\0'):
char amPmBuf[3];
把所有读取amPmChar的代码改为:
cin >> amPmBuf; startIsAM = (amPmBuf[0] == 'A') || (amPmBuf[0] == 'a');
修正后完整代码示例
#include <iostream> #include <limits> using namespace std; int main() { int startHours, startMinutes; int endHours, endMinutes; bool startIsAM, endIsAM; char extra; char amPmBuf[3]; int computeDifference(int startH, int startM, bool startTime, int endH, int endM, bool endTime); int diff, hours, minutes; cout << "Enter start time, in the format 'HH:MM xm', where 'xm' is\n either 'am' or 'pm' for AM or PM: "; cin >> startHours; cin >> extra; cin >> startMinutes; cin >> amPmBuf; startIsAM = (amPmBuf[0] == 'A') || (amPmBuf[0] == 'a'); // 清空缓冲区避免输入额外内容影响后续逻辑 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "Enter future time in the format 'HH:MM xm' where 'xm' is\n either 'am' or 'pm': "; cin >> endHours; cin >> extra; cin >> endMinutes; cin >> amPmBuf; endIsAM = (amPmBuf[0] == 'A') || (amPmBuf[0] == 'a'); // 后续计算逻辑 return 0; }
内容的提问来源于stack exchange,提问作者Deez Nuts
相关产品推荐
相关产品推荐

