尽管没有循环,为什么这段代码会保持循环?

时间:2015-03-08 19:09:09

标签: c++

正如标题所说,当输入不是整数而是字符串时,我无法弄清楚为什么这段代码会继续丢弃。

编辑:好像你误解了我的问题,让我澄清并搞砸所有代码。

在我输入教师后,我不想退出该计划,因为有一个案例(案例0)可以处理。我想知道的是,如果我在要求birtdate而不是整数的部分中输入字符串,代码会保持循环,但如果我输入一个整数,则工作正常。

在这种情况下,如果要输入的整数,程序按预期运行,但当它是一个字符串时,程序会继续循环它要求birthdate的部分。即使在删除ifelse之后,它仍会执行相同的操作,因为它没有错误处理,因此会崩溃。

  int main()
{
    string tempName;
    int tempYear;
    char input = 't';
    bool exit = 0;
    do
    {
        cout << "Please choose one of the following options:" << endl;
        cout << "0. Quit" << endl;
        cout << "1. Add new Teacher" << endl;
        cout << "2. Add new Assistant" << endl;
        cout << "3. Add new TA-personel" << endl;
        cout << "4. Show all Staff" << endl;
        cout << "You chose: ";
        cin >> input;
        cout << endl;

        switch (input)
        {
        case '0':
            exit = 1;
            break;
        case '1':
            cout << "Please enter the name of the teacher: ";
            cin >> tempName;
            cin.ignore();

            cout << "Please enter the birthdate of the teacher: ";
            cin >> tempYear;
            cin.ignore();
            if (!cin.fail())
            {
                //Nothing
            }
            else
            {
                cout << "The input was not a number!";
                cout << "1. Please enter the birthdate of the teacher: ";
                cin >> tempYear;
            }
            break;
        case '2':
            break;
        case'3':

            break;
        case '4':

            break;
        default:
            cout << "Invalid input!" << endl;
            break;
        }
    } while (exit == 0);
    getchar();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

这段代码(或者你完整的MCVE,无论如何,你忽略了共享-.-)将永远循环,因为你永远不会改变命名不佳的变量exit的值。

更新

请记住检查!cin.fail()时的情况?这是正确的做法,但你没有为下一次尝试设置失败标志。

cin.clear();

答案 1 :(得分:0)

您没有修改循环内的exit变量。

因此,如果在循环之前将while设置为exit,则0循环的条件始终为真。

答案 2 :(得分:0)

首先,代码不完整。

1.您需要更改变量名称的值&#34;退出&#34;在switch-case中为非零值以结束与用户选择退出选项相对应的循环。

  1. 您需要在do-while循环内以及switch语句开始之前向用户请求新的选择。

  2. 将tempyear的变量类型更改为string。 例如:

  3. char char;

    do
    {
       cin>>choice;
    
       switch(choice)
       {
           case '0': exit=1;
                     break;
       }
    
    }while(exit==0)
    

    当用户输入0

    时,这将结束循环

    <强>更新

    当您在int变量 tempyear 中输入字符串值时,它进入无限循环的原因是 cin 错误输入标志输入字符串后设置>。

    要解决此问题,您需要在 cin.ignore()之后使用 cin.clear(),以便重置错误输入标记并再次输入 - 如@Lightness Races in Orbit指出