下面的代码应该让我从菜单中选择一个选项,然后显示 switch 语句中的适当行。它仅在我选择选项“g”时有效。如果我选择“c”,它会显示 cout
行,但随后会跳过循环并退出程序。我做错了什么?
#include <iostream>
#include <cctype>
using namespace std;
enum {c='c', p='p', t='t', g='g'}; // 0-3
int main(){
cout
<< "Elija una opcion del menu:" << endl
<< "c) carnivoros" << endl
<< "p) pianista" << endl
<< "t) Arbol" << endl
<< "g) Juegos" << endl;
char eleccion;
cin.get(eleccion);
while (eleccion >= c && eleccion <= g){
switch (eleccion)
{
case 'c' : cout << "Te gusta la carne e!\n"; break;
case 'p' : cout << "Sos pianista?\n"; break;
case 't' : cout << "Naturista!\n"; break;
case 'g' : cout << "Vicio!\n"; break;
}
cout
<< "Elija una opcion del menu:" << endl;
cin.get(eleccion);
}
_getche();
return 0;
}
最佳答案
你的代码有两个问题:
cin.get(eleccion);
不会从输入流中清除换行符,所以在下次调用cin.get
时, 它将读取超出您指定范围的换行符并终止循环。使用cin >> eleccion;
来解决这个问题。当您将 ASCII 字母分配给您的枚举时,最大的枚举不是
g
而是t
,因此您的循环 header 应如下所示:while ( c <= eleccion && eleccion <= t){
这个版本仍然有缺点,如果你在 c
和 t
之间输入任何字符(这是大部分字母表),你的循环会继续,即使它不是一个有效的选择。出于这个原因,我将按如下方式更改程序:
using namespace std;
//enums are not needed
int main(){
cout << "Opciones:" << endl
<< "c) carnivoros" << endl
<< "p) pianista" << endl
<< "t) Arbol" << endl
<< "g) Juegos" << endl;
bool rightChar = true;
while (rightChar){
cout << "Elija una opcion del menu:" << endl;
char eleccion;
cin >> eleccion;
switch (eleccion)
{
case 'c': cout << "Te gusta la carne e!\n"; break;
case 'p': cout << "Sos pianista?\n"; break;
case 't': cout << "Naturista!\n"; break;
case 'g': cout << "Vicio!\n"; break;
default: rightChar = false;
}
}
return 0;
}
关于c++ - 无法使循环正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422990/