发出接受char类型的输入

时间:2017-12-12 16:53:41

标签: c++

我正在尝试一个简单的程序。当输入为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'));
}

1 个答案:

答案 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'));
}