如何检查输入是否有效,如果无效,则继续要求输入



谁能解释一下为什么这个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,当它开始调试并打印消息两次。如果我输入ppp,它会显示

打印三次等…

首先,您对switch的工作方式存在误解。每个case必须以break语句结束,这样下一个就不会被执行。
这意味着break会破坏switch,而不是while

但是主要的问题是你的程序逻辑是错误的。
您不应该循环给定输入的有效性,让switch语句在default子句中处理它。

相反,你应该在用户按q键时设置一个标志。

考虑到您定义了以下函数,分别用于显示菜单和请求操作数(为了代码可读性而定义):

void display_menu(char & choice)
{
std::cout << "Operation:na: Additionnm: Multiplicationns: Substractionnq: Quitn";
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;
}

生活例子

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

最新更新