使用Switch c++从用户获取输入

Getting input from user with Switch C++

本文关键字:获取 输入 用户 Switch c++ 使用      更新时间:2023-10-16

我有一个系统,用户可以输入尽可能多的输入,并进行一些计算。

下面是完成这个任务的代码:

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;

将调试打印代码添加到交换机的默认情况下,可以清楚地显示发生了什么:

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

意想不到的:10

十进制10是在std::cin上使用operator>>进行格式化输入后仍在输入缓冲区中的换行n

要纠正这个问题,可以忽略流中的剩余字符(想想当用户请求数字时没有输入数字时会发生什么),直到下一个换行字符,在完成格式化输入后:

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

或者使用格式化的输入(它会自动跳过):

cin >> op;

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