如何修复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
相关产品推荐
相关产品推荐

