为什么在c++中每个循环都不要求命令行输入?

Why does a loop not ask for command line input every cycle in C++?

本文关键字:命令行 输入 循环 c++ 为什么      更新时间:2023-10-16

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

如果用户输入的数字不是有效的等级,则程序成功地循环并请求有效的输入,直到用户输入适当的等级。

但是,如果用户输入一个根本不是数字的String,例如"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 << "nn";
        break;
    } else {
        cout << "Please enter a valid grade: ";
    }
}
}

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

cin.clear(); // clear error flags
cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

您需要为此包含<limits>标头