我正在尝试一个简单的程序。当输入为Y或y,或n或N时,此方法可正常工作。但是,如果我输入的输入为YY或yy,则表现不同。你能解释一下原因吗?当输入为NN或nn时,同样的情况不会发生.-我是编程新手,所以请帮助我
void main()
{
char ch = 'y';
int choice;
do {
cout << "Enter a number :";
cin >> choice;
cout << "do you want to continue :";
cin >> ch;
} while ((ch == 'y') || (ch == 'Y'));
}
答案 0 :(得分:1)
您的输入:YY
cin>>choice;
尝试读取整数,但失败了。设置了错误标志,使cin
无法使用。
它已经处于失败状态,您尝试读取一个字符。它忽略了你。由于您已将ch
初始化为Y
(并且cin
未修改ch
因为它处于失败状态),因此会一次又一次地持续发生这种情况循环运行永远。
如果您想在错误后让cin
再次工作,则需要使用cin.clear()
清除错误位。请注意,cin.clear()
会重置错误位,但不会将流指针向前移位。这意味着您在使用Y
后仍处于第一个cin.clear()
。
如果您在cin.clear()
之后添加cin>>choice;
,则cin
错误将被重置(如果有的话)并将cin
继续。如前所述,流指针仍将指向第一个字符,因此cin>>ch;
将最终读取第一个字符。此过程会重复,cin>>choice;
将再次失败,cin>>ch;
将最终阅读最后一个Y
。现在cin>>choice
会尝试读取一些东西,但它意识到它已经到达输入的结尾(也就是文件末尾; EOF)。这将再次设置错误位。你清除了错误位并让cin>>ch;
读取了一些东西,但这也失败了,因为你已经到了最后。由于ch
之前有“Y”或“y”(因为您处于当前迭代中,这意味着条件已满足),它将继续保持原样。你最终会再次出现无限循环。
修复是在顶部循环内将ch
设置为'N',以便在出现错误时循环中断。 (可选)您可以在使用cin>>choice;
后立即使用cin.ignore();
忽略错误输入(cin.clear()
的字符)。
void main(){
char ch;
int choice;
do{
ch='n'; //assume no unless told
cout<<"Enter a number :";
cin.clear();
cin>>choice;
cout<<"do you want to continue :";
cin>>ch;
}while((ch=='y')||(ch=='Y'));
}