C++如何避免char输入流入int变量 多次非法输入仅输出一次警告
问题原因
你当前代码中的cin.ignore()只会从输入缓冲区丢弃1个字符,当你输入多个无效字符时,剩余字符会留在缓冲区中,下次执行cin >> num时会继续读取这些无效字符,进而重复触发失败逻辑和警告。
解决方案
你需要一次性清空输入缓冲区中当前行的所有剩余无效字符,修正后的代码如下:
#include <iostream> #include <limits> // 需引入该头文件使用numeric_limits using namespace std; int main() { int num = 0; cin >> num; while (cin.fail()) { cout << "Invalid input. Try again\n"; cin.clear(); // 先重置cin的错误状态 // 清空当前行所有剩余字符,直到遇到换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin >> num; } cout << "Valid input: " << num << endl; return 0; }
代码说明
cin.ignore(numeric_limits<streamsize>::max(), '\n')表示连续丢弃缓冲区中的字符,直到满足两个条件之一:- 已经丢弃了
numeric_limits<streamsize>::max()个字符(该值是输入缓冲区允许的最大长度,相当于不限制丢弃数量) - 遇到换行符
\n,也就是用户本次输入的整行内容全部被清空
- 已经丢弃了
无论用户一次输入多少个无效字符,都会被一次性清空,每次错误只会触发一次警告。
内容的提问来源于stack exchange,提问作者Tomurisk
相关产品推荐
相关产品推荐

