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

如何修复C++程序中int类型输入非数字时的分支判断错误?

套餐A费用计算代码的输入异常修复方案

问题根源

当用户输入字母、符号这类非整数内容时,cin >> hours 会读取失败,输入流进入错误状态,此时hours变量的值不会被正确更新(大概率是内存里的垃圾值),导致后续条件判断误触发hours>=0 && hours<10的分支,而不是执行错误提示的else分支。

修复步骤

  • 读取输入后立即用cin.fail()判断输入是否成功
  • 若输入失败,调用cin.clear()清空输入流的错误状态,再用cin.ignore(numeric_limits<streamsize>::max(), '\n')跳过当前输入行的所有无效内容,避免影响后续操作
  • 调整判断逻辑,优先处理输入无效的情况,再进行小时数的范围校验

修复后的完整代码

// RUNS IF PACKAGE = A
if(package=='A')
{
    // SETS MONEY TO 9.95
    money = 9.95;
    // ASKS USER HOW MANY HOURS THEY USED
    cout<<"How many hours did the customer use last month?";
    // USER INPUTS HOURS
    cin>>hours;                    
    cout<<""<<endl;

    // 先检查输入是否有效
    if(cin.fail())
    {
        cout<<"Hours input invalid"<<endl<<endl;
        // 清空错误状态,跳过无效输入
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    else if(hours>=10 && hours<=744)
    {
        // ISOLATES THE EXTRA HOURS THE USER IS USING           
        hours-=10;                    
        // CALCULATES THE TOTAL MONTHLY CHARGES
        money+=2*hours;              
        // PRINTS MONTHLY CHARGES   
        cout<<"The monthly charges are $"<<money<<endl<<endl;
    
        if(money>14.95)
        {
            // CALCULATES SAVINGS FOR PACKAGE B
            savings=14.95+hours-9.95;         
            // PRINTS THE SAVINGS
            cout<<"By switching to Package B you would save $"<<savings<<endl<<endl;
            // RECALCULATES IT FOR PACKAGE C
            savings =money-19.95;   
            // PRINTS SAVINGS FOR PACKAGE C
            cout<<"By switching to Package C you would save $"<<savings<<endl<<endl;
        } 
    }
    else if(hours>=0 &&hours<10)// RUNS THIS STATEMENT IF HOURS>0 AND HOURS < 10
    {
        // PRINTS MONTHLY CHARGES
        cout<<"The monthly charges are $"<<money<<endl<<endl;
    }
    else
    {
        // IF NO OTHER CONDITION IS VALID THIS ONE IS PRINTED
        cout<<"Hours input invalid"<<endl<<endl;
    }
}

注:使用numeric_limits需要在代码开头包含头文件 <limits>

内容的提问来源于stack exchange,提问作者Daddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:05:35