为什么循环不要求C ++中的每个循环输入命令行?

时间:2015-08-13 14:52:33

标签: c++ while-loop cin

我有一个用C ++编写的小程序,它为用户的等级请求命令行输入。如果输入有效(即0到100之间的数字),则会调用一个开关根据用户的等级打印出一些内容,然后程序成功退出。

如果用户输入的号码不是有效等级,程序会成功循环并询问有效输入,直到用户输入适当的等级。

但是,如果用户输入的字符串根本不是数字,例如“no”,则循环无限地请求有效等级,而不会停止接收输入,最终导致命令行崩溃。

完整的计划:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(int argc, char** argv) {

cout << "\nEnter your grade: ";

int grade;

// Infinite input loop.
while(true) {
    // Is the String a valid grade?
    if(cin >> grade && grade >= 0 && grade <= 100) {
        switch(grade / 10) {
            case 10:
            case 9:
                cout << "A is for \"Awesome\"!";
                break;
            case 8:
                cout << "B is okay.";
                break;
            case 7:
                cout << "C isn't okay.";
                break;
            case 6:
                cout << "Bad luck.";
                break;
            case 5:
            case 4:
            case 3:
            case 2:
            case 1:
                cout << "Ouch!";
                break;
        }
        cout << "\n\n";
        break;
    } else {
        cout << "Please enter a valid grade: ";
    }
}
}

1 个答案:

答案 0 :(得分:1)

这是因为流进入故障状态。在流中设置失败位时,所有操作都将失败。您需要在流上调用clear()以清除错误标志,然后您需要删除仍可能在流中的任何额外输入。你可以用

做到这一点
cin.clear(); // clear error flags
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

您需要为此添加<limits>标题。