下面的代码应该让我从菜单中选择一个选项,然后从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;
}
答案 0 :(得分:3)
您的代码中存在两个问题:
cin.get(eleccion);
不会清除输入流中的新行字符,所以在下次调用cin.get
时,它会读取换行符,这超出了你的范围指定,它将终止循环。请使用cin >> eleccion;
来解决此问题。
当你为你的枚举分配ASCII字母时,bigges枚举不是g
而是t
,所以你的循环标题应如下所示:
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;
}
答案 1 :(得分:1)
(eleccion >= c && eleccion <= g)
此行打破了它。
enum {c='c', p='p', t='t', g='g'}; // 0-3
enum不会是c = 0 ... g = 3,但它将是c = 99,p = 112,t = 116,g = 103,
因此,你的if会变成:
(eleccion >= 99 && eleccion <= 103)
112和116显然没有通过这个条件。
同样正如LightningRacisinOrbit所指出的那样,你也会遇到缓冲区中剩余的换行问题。解决方法是使用cin >> eleccion
作为MikeMB建议。
您可以将if语句中的条件更改为
(eleccion >= c && eleccion <= t)
然而它仍然非常丑陋。可能这是最好的:
(eleccion == c || eleccion == g || eleccion == p || eleccion == t)