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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:39:00