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

C++如何编写while循环仅接受两位小数的float格式时间合法输入

校验时间输入的while循环实现方案

原代码存在的问题

  • 仅校验了数值范围在012之间,未校验小数部分是否符合分钟的取值要求(分钟必须在059之间,例如9.61、10.70这类输入都是不合法的)
  • 没有处理非数字输入的异常场景,如果用户输入字母、符号等非浮点数内容,cin会进入错误状态,原循环会直接终止,不符合需求

修改后代码

#include <iostream>
#include <cmath>
#include <limits>
using namespace std;

int main() {
    float time;
    cout << "请输入时间:";
    while (true) {
        // 判断输入是否为合法浮点数
        if (cin >> time) {
            int hour = static_cast<int>(time);
            // 四舍五入避免浮点数精度误差导致分钟计算错误
            int minute = static_cast<int>(round((time - hour) * 100));
            
            // 自定义校验规则,可根据需求调整边界值
            if (hour >= 0 && hour <= 12 && minute >= 0 && minute <= 59) {
                break;
            } else {
                cout << "输入无效,请输入合法的时间:";
            }
        } else {
            // 处理非数字输入的错误状态
            cin.clear();
            // 清空缓冲区残留的非法输入
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "输入无效,请输入合法的数字:";
        }
    }
    // 此处接续上午/下午判断逻辑
    return 0;
}

关键逻辑说明

  • 浮点数拆分:把输入的数值拆分为小时的整数部分和分钟的小数部分,单独校验分钟的取值范围,避免出现分钟超过59的非法值
  • 精度处理:用round()方法对计算出的分钟做四舍五入,解决浮点数存储精度不足导致的计算偏差(比如输入9.24实际存储为9.239999999,直接取整会得到23而不是24的问题)
  • 异常处理:当用户输入非数字内容时,先清空cin的错误标记,再清空输入缓冲区的残留内容,保证循环可以正常接收后续输入

内容的提问来源于stack exchange,提问作者Georges St-Isidore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:42:02