使用 Switch C++ 从用户那里获取输入

Getting input from user with Switch C++

我有一个系统,用户可以输入任意数量的输入 s/he 并进行一些计算。

这里是实现这个任务的代码:

int main() {
    char op = 's';
    float time=0, fuel_rate=0, start=0, end=0, pace=0;


    while(op != 'x'){
        cout << "Please select: " << endl;
        cout << "1 ---> A" << endl;
        cout << "2 ---> B" << endl;
        cout << "3 ---> Calculate" << endl;
        cout << "x ---> Exit" << endl;

        op = std::getchar();

        //remove the rest of the line from input stream
        int temp;
        while ( (temp = std::getchar()) != '\n' && temp != EOF );

        switch(op){
        case '1':
            cout << "Enter time: ";
            cin >> time;
            cout << "Enter fuel rate: ";
            cin >> fuel_rate;
            break;
        case '2':
            cout << "Enter start: ";
            cin >> start;
            cout << "Enter end: ";
            cin >> end;
            cout << "Enter pace: ";
            cin >> pace;
            cout << "Enter fuel rate: ";
            cin >> fuel_rate;
            break;
        case '3':
            cout << "Total value";
            break;
        case 'x':
            return 0;
        default:
            continue;
        }
    }
    return 0;
}

系统在第一次输入时运行良好。示例控制台日志如下所示:

 Please select: 
1 ---> A
2 ---> B
3 ---> Calculate
x ---> Exit
1
Enter time: 2
Enter fuel rate: 3
Please select: 
1 ---> A
2 ---> B
3 ---> Calculate
x ---> Exit
2
Please select: 
1 ---> A
2 ---> B
3 ---> Calculate
x ---> Exit

首次用户进入操作1,系统询问时间和油量。当用户输入操作 2 时,系统不要求开始、结束或速度。

关于如何解决这个问题有什么想法吗?

我相当确定 std::getchar() 是造成您大部分问题的原因。如果我更改您的代码以使用:

cin >> op;
switch (op) { 
//...

而不是

op = std::getchar();

//remove the rest of the line from input stream
int temp;
while ( (temp = std::getchar()) != '\n' && temp != EOF );

switch(op){
//...

程序运行正常。

您正在混合使用 std::cinstdin。你应该坚持其中之一。而不是

    op = std::getchar();

使用

    op = cin.get();

你应该移动这些行:

    int temp;
    while ( (temp = std::getchar()) != '\n' && temp != EOF );

switch 块结束后,确保您使用 temp = cin.get()

未使用的换行符留在输入流中,因为您正在使用 operator>>() 读取数据,例如:

    cin >> fuel_rate;

Adding debugging print code 你的开关的默认情况清楚地显示了发生了什么:

// ...
default:
  cout << "unexpected: " << int(op) << endl;
  continue;
// ...

unexpected: 10

小数 10 是在 std::cin.

上使用 operator>> 进行格式化输入后仍在输入缓冲区中的换行符 \n

要更正此问题,您可以 ignore 流中的剩余字符(想一想当您请求时用户未输入数字时会发生什么),直到并包括下一个换行符,在您之后格式化输入:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

或者使用格式化输入(它自己进行跳过):

cin >> op;

虽然您还需要处理文件结束条件,但您当前的代码无法做到这一点,正如您在上面的示例 运行 中看到的那样。