无法使环路正常工作

Cant make the loop work properly

本文关键字:工作 常工作 环路      更新时间:2023-10-16

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

您的代码中有两个问题:

  1. cin.get(eleccion);不会从输入流中清除换行符,因此下次调用cin.get时,它将读取换行符,该换行符在您指定的范围之外,并终止循环。请改用cin >> eleccion;来解决此问题。

  2. 当您将ASCII字母分配给枚举时,bigges枚举不是g,而是t,因此循环头应该如下所示:

    while (  c <= eleccion && eleccion <= t){ 
    

这个版本仍然有一个缺点,即如果输入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;
}
(eleccion >= c && eleccion <= g)

这条线打破了它。

enum {c='c', p='p', t='t', g='g'}; // 0-3

枚举不会是c=0。。。g=3,但它将是c=99,p=112,t=116,g=103,

因此,您的if将变成:

(eleccion >= 99 && eleccion <= 103)

而112和116显然没有通过这个条件。


正如LightningRacisinOrbit指出的那样,换行符也会出现在缓冲区中的问题。解决方案是按照MikeMB的建议使用cin >> eleccion


您可以将if语句中的条件更改为

(eleccion >= c && eleccion <= t)

然而,它仍然非常丑陋。也许这将是最好的:

(eleccion == c || eleccion == g || eleccion == p || eleccion == t)