为什么在将无效类型传递给变量后 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' 之前要跳过多少个字符,我们将其设置为可能的最大大小。
它是一个菜单驱动程序,当将 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' 之前要跳过多少个字符,我们将其设置为可能的最大大小。