Visual Studio中C++程序第二个cin输入行被跳过问题求助
问题根因分析
你遇到的第二个输入被跳过的核心原因是变量类型不匹配导致输入流进入失败状态,关联还有多处逻辑错误,具体问题如下:
- 你将
startIsAM、endIsAM定义为bool类型,但代码中试图用这两个变量存储输入的a/A/p/P字符:bool类型只能存储true(非0)和false(0),当cin尝试将字符输入到bool变量时,会触发输入流的failbit错误位,后续所有cin操作都会直接跳过,不会等待用户输入。 - 即使修正了变量类型,输入
am/pm时,读完第一个字符a/p后,剩余的m会残留在输入缓冲区,干扰后续输入的读取。 convertDifference函数中存在逻辑错误:你已经把startIsAM/endIsAM赋值为true/false,后续还拿布尔值和字符'p'比较,条件永远不会成立,时间转换逻辑完全失效。
修复步骤
- 修正变量类型:把
startIsAM、endIsAM的类型从bool改为char,用来存储输入的a/p字符 - 清理输入缓冲区残留:每次读取完时间输入后,忽略当前行剩余的所有字符,避免残留的
m、换行符干扰后续输入 - 修正时间转换逻辑:调整
convertDifference函数中的判断条件,适配布尔值的判断逻辑,同时修复原代码中判断结束时间pm时错误引用开始时间变量的问题。
核心修改代码片段
首先在文件头新增必要头文件:
#include <iostream> #include <limits> // 用于输入缓冲区清理
修改main函数中的变量定义:
// 把bool类型改为char char startIsAM; char endIsAM;
每次读完时间输入后添加缓冲区清理代码:
cin >> startHours >> extra >> startMinutes >> startIsAM; // 新增:忽略当前行剩余所有字符 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin >> endHours >> extra >> endMinutes >> endIsAM; // 新增:忽略当前行剩余所有字符 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
修正convertDifference函数的判断逻辑:
// 原判断startIsAMPar == 'p'改为:因为你赋值逻辑是a/A对应true(am),所以pm对应false if (!startIsAMPar) { if (startHoursPar >= 1 && startHoursPar < 12) { startHoursPar += 12; } } if (!endIsAMPar) { if (endHoursPar >= 1 && endHoursPar < 12) // 原代码这里错误判断startHoursPar,已修正 { endHoursPar += 12; } }
内容的提问来源于stack exchange,提问作者appl3bees
相关产品推荐
相关产品推荐

