无法使循环正常工作

时间:2015-04-02 21:43:32

标签: c++

下面的代码应该让我从菜单中选择一个选项,然后从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;
}

2 个答案:

答案 0 :(得分:3)

您的代码中存在两个问题:

  1. cin.get(eleccion);不会清除输入流中的新行字符,所以在下次调用cin.get时,它会读取换行符,这超出了你的范围指定,它将终止循环。请使用cin >> eleccion;来解决此问题。

  2. 当你为你的枚举分配ASCII字母时,bigges枚举不是g而是t,所以你的循环标题应如下所示:

    while (  c <= eleccion && eleccion <= t){ 
    
  3. 此版本仍有缺点,即如果您输入ct之间的任何字符(大部分字母表中的字符串),即使它不是有效选择,您的循环仍会继续。出于这个原因,我将按如下方式更改程序:

    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)