为什么在将无效类型传递给变量后 cin 不接受输入

Why isn't cin taking input after an invalid type is passed to the variable

它是一个菜单驱动程序,当将 int 传递给变量 options 时工作完全正常,但当传递 char 时会陷入无限循环。

int main(){

while(true){
    int options{0};
    cout<<"\nYour choice >>";
    cin>>options;         //this line doesnt execute after any char(say r) is given as an input
    switch(options){
        case 1:login();break;
        case 2:signup();break;
        case 3:return 0;
        default:cerr<<"Please enter a valid choice"<<endl;
    }
}


txt.close();
return 0;

} 我尝试调试,但问题出在这里

断点 1,main () 在 main.cpp:16 16 cin>>选项; (gdb) p 选项 $1 = 0 (gdb) c 继续。 你的选择>>r

断点 2,main () 在 main.cpp:17 17 开关(选项){ (gdb) p 选项 $2 = 0 (gdb) c 继续。

断点 3,main () 在 main.cpp:21 21 default:cerr<<"请输入有效的选择"<

断点 1,main () 在 main.cpp:16 16 cin>>选项; (gdb) c 继续。

断点 2,main () 在 main.cpp:17 17 开关(选项){ (gdb) 退出 (gdb)

在第 16 行之后进入第 17 行而不要求用户输入

这是因为 C++ 流的工作方式。
当出现与流操作的内部逻辑相关的错误时(例如期望一个 int 但得到一个 char),它的 failbit 被设置。
当其中一个流 bits (failbit, badbit, eofbit) 被设置时,流操作将不会做任何事情。
要重置 iostate,可以使用流的 clear 方法:

std::cin.clear();

这将设置 goodbit,这意味着其他 3 位关闭,您可以使用流。
要检查这些 ,您可以使用状态方法:good()fail()bad()eof()
但请记住,流有一个转换运算符到 bool which returns !fail() 所以你可以在布尔上下文中使用流:

char c;
while (std::cin >> c) {...

如果你想跳过错误的输入行,你可以在clear()之后这样做:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

这基本上会跳过流缓冲区中的所有字符,直到到达“\n”。第一个参数是在 EOF 或 '\n' 之前要跳过多少个字符,我们将其设置为可能的最大大小。