尝试捕捉重复循环

时间:2017-04-04 14:41:52

标签: c++ exception try-catch

嘿,这一切都是我的代码

void Student::studentMenu() {
    int choiceInput;
    const string ErrorMsg;
    cout << "-------------Student Menu--------------" << endl;
    cout << "(1)Start Quiz" << endl;
    cout << "(2)View History Score Table" << endl;
    cout << "(0)Exit" << endl;
    cout << "Option: " << endl;
    try {
        cin >> choiceInput;

        if (choiceInput < 0 || choiceInput>2 || !cin)
        {
            throw (ErrorMsg);
        }

        while (choiceInput != 0) {
            switch (choiceInput) {
            case 1:
                generateQuiz();
                break;
            case 2:
                break;
            case 0:
                break;
            }
            break;
        }
    }
    catch (string msg)
    {
        cout << "Please only enter valid integer from 0-3" << endl;
        Student::studentMenu();
    }
}

基本上它检查用户输入并在其非整数大于3时抛出异常。显示错误消息后,它应重定向回学生菜单()页面。当我输入一个像5这样的整数但是当我输入一个字符'f'时它会保持循环错误信息

请帮助我谢谢!

3 个答案:

答案 0 :(得分:3)

cin >> choiceInput;

当输入不是可解析的整数时会发生什么,cin不会自动跳过它。这意味着你会陷入这个价值:你尝试阅读它,它失败了,你进行了一次迭代,你尝试阅读它,失败等等。要解决这个问题,你应该ignore错误的字符如果读取失败(例如!cin返回true)。通常,这看起来像这样:

if (!cin) {
    cin.clear();
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} //proceed

cin.clear()需要清除failbit,以便!cin再次变为假“

答案 1 :(得分:0)

您需要使用无效值初始化choiceInput变量:

int choiceInput = -1;

并且在使用cout.flush()时请确保在调用studentMenu()之前清理缓冲区:

  catch (string msg)
  {
    cout << "Please only enter valid integer from 0-3: " << choiceInput << endl;
    cout.flush();
  }

答案 2 :(得分:0)

choiceInput是一个整数,'f'的ascii值是102,>&gt; 2.我建议你在choiceInput上添加一些检查以确保它是整数而不是字符。

How to check if input is numeric in C++