接受类型char的输入的问题

Issue accepting input of type char

本文关键字:输入 问题 char 类型      更新时间:2023-10-16

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

您的输入:YY

cin>>choice;试图读取整数,但失败。设置了错误标志,使cin无法使用。

它已经处于失败状态,您尝试阅读角色。它忽略了你。由于您已将ch初始化为Y(并且cin没有修改ch,因为它处于失败状态),这将不断发生。

如果要在错误后再次使用cin,则需要使用cin.clear()清除错误位。请注意,cin.clear()重置错误位,但不会将流指针移动到前方。这意味着在使用cin.clear()之后,您仍处于第一个Y

如果您在cin>>choice;之后添加cin.clear(),则cin错误将被重置(如果有的话),并且将让cin继续进行。如前所述,流指针仍将指向第一个字符,因此cin>>ch;最终会读取第一个字符。此过程重复,cin>>choice;将再次失败,cin>>ch;最终将读取最后一个Y。现在,cin>>choice将尝试阅读一些内容,但它意识到它已达到输入的末端(又称文件末端; eof)。这将再次设置错误位。您清除了错误位,让cin>>ch;读取一些内容,但这也失败了,因为您已经达到了终点。由于ch先前具有" Y"或" Y"(因为您处于当前迭代中,这意味着该条件得到了满足),因此它将继续保持原样。您最终再次获得无限循环。

修复程序是将ch设置为顶部的循环内部的'n',以便在错误时循环断开。可选地,您可以在使用cin.clear()后立即使用cin.ignore();忽略错误输入(cin>>choice;的字符)。

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