C++货币转换程序输入非整数重复提示问题求解
C++货币转换程序输入校验异常修复
问题原因
- 向int类型变量输入字符串时,
cin会进入失败状态,流内的所有输入内容都不会被读取,后续cin操作会直接失效 - 原有代码仅调用
cin.ignore()忽略1个字符,若输入字符串长度大于1,剩余字符会持续触发读取失败,导致提示重复输出 - 校验逻辑冗余:if分支内重复执行
cin >> currency,和外层循环校验逻辑冲突,容易引发逻辑异常
修复方法
- 新增
<limits>头文件引入缓冲区长度常量 - 输入后先判断
cin是否处于失败状态,若失败先重置状态,再清空整个输入缓冲区的残留内容 - 删除if分支内冗余的输入读取逻辑,统一由外层循环处理输入校验
修复后完整代码
#include <iostream> #include <string> #include <limits> using namespace std; int main() { int currency = 0; string USD = "USD"; string EUR = "EUR"; string JPY = "JPY"; string GBP = "GBP"; string CHF = "CHF"; string CAD = "CAD"; string AUD = "AUD"; string ZAR = "ZAR"; cout << "***Currency Converter***\n\n"; do { cout << "Select initial currency\n"; cout << "1. " << USD << "\n"; cout << "2. " << EUR << "\n"; cout << "3. " << JPY << "\n"; cout << "4. " << GBP << "\n"; cout << "5. " << CHF << "\n"; cout << "6. " << CAD << "\n"; cout << "7. " << AUD << "\n"; cout << "8. " << ZAR << "\n"; cin >> currency; // 校验输入合法性 if (cin.fail() || currency <= 0 || currency >= 9) { cout << "Please enter a valid input\n"; cin.clear(); // 重置输入流状态 // 清空整个输入缓冲区所有残留字符,直到遇到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); } } while (cin.fail() || currency <= 0 || currency >= 9); if (currency == 1) { cout << "You've selected USD\n"; } else if (currency == 2) { cout << "You've selected EUR\n"; } else if (currency == 3) { cout << "You've selected JPY\n"; } else if (currency == 4) { cout << "You've selected GBP\n"; } else if (currency == 5) { cout << "You've selected CHF\n"; } else if (currency == 6) { cout << "You've selected CAD\n"; } else if (currency == 7) { cout << "You've selected AUD\n"; } else if (currency == 8) { cout << "You've selected ZAR\n"; } return 0; }
内容的提问来源于stack exchange,提问作者skylar.gmaker
相关产品推荐
相关产品推荐

