c++ 如何检查输入是否有效,并在无效时继续要求输入

vbopmzt1  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(246)

有人能解释一下为什么while循环不能正常工作吗?

#include <iostream>
using namespace std; 
void ask_user(int a, int b){
    char choice = ' '; 
    while(choice != 'q' && choice != 'a' && choice != 's' && choice != 'm'){
        cout << "choose operation" << endl; 
        cout << "a to add, s to subtract, m to multiply and q to quit" << endl; 
        cout << "----------------------------" << endl;
        cin >> choice;
        switch(choice){
            case 'a' : cout << "a + b = " << a + b; 
            break;
            case 's' : cout << "a - b = " << a + b; 
            break;
            case 'm' : cout << "a * b = " << a + b;
            break;
            case 'q' : break; 
            default: cout << "please Enter a valid choice " << endl;
        }
    }
}

int main(){
    ask_user(7, 9); 
    return 0; 
}

如果我输入p作为例子,这是无效的,那么它的工作很好,并要求有效的输入再次,
但是如果我输入pp,它就开始出错,并打印两次消息。
打印三次等。

dddzy1tm

dddzy1tm1#

首先,您对switch的工作原理有误解,每个case都必须以break语句结束,这样下面的语句就不会执行。
这意味着break将破坏switch,而不是while
但主要的问题是你的程序的逻辑是错误的。
您不应该遍历给定输入的有效性,让switch语句在default子句中处理它。
相反,您应该循环遍历一个标志,当用户按q键时,该标志将被设置。
因此,考虑到您定义了以下函数,分别用于显示菜单和请求操作对象(定义用于代码可读性):

void display_menu(char & choice)
{
    std::cout << "Operation:\na: Addition\nm: Multiplication\ns: Substraction\nq: Quit\n";
    std::cin >> choice;
}
void ask_operands(int & a, int & b)
{
    std::cout << "\na ?";
    std::cin >> a;
    std::cout << "\nb ?";
    std::cin >> b;
    std::cout << '\n';
}

代码的逻辑可以重写为:

int main()
{
    bool quit = false;
    char choice;
    int a, b;

    ask_operands(a, b); // Ask the user which operands to use
    while(!quit)        // loop over the flag
    {
        display_menu(choice);

        switch(choice)
        {
            case 'a': std::cout << (a+b);
                      break;
            case 'm': std::cout << (a*b);
                      break;
            case 's': std::cout << (a-b);
                      break;
            case 'q': std::cout << "Exiting...";
                      quit = true; // Set the flag to false
                      break;
            default: std::cout << "Invalid choice, try again."; //Here you handle the invalid choices (i.e. let the loop iterate again)
        }
        std::cout << '\n';
    }

    return 0;
}

Live example

**注意:**如果希望用户能够在每次迭代时更改操作数的值,只需将ask_operands(a, b);调用移到循环内部。

相关问题