c++ - 无法使循环正常工作

标签 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;
}

最佳答案

你的代码有两个问题:

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

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

    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;
}

关于c++ - 无法使循环正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422990/

相关文章:

c++ - 计时: How can I calculate a millsecond duration from two high resolution time points?

c++ - to_string(42) 不止一个实例匹配参数

java - 如何将静态库链接到在 NDK Android Build 中用作 native 库的源

C++11 线程,在主线程上运行

c++ - 在 Linux 中替换 <conio.h>

c++ - 传递显式空参数包

c++ - 如何点击 Blackberry Cascades qml 和 qt 中的列表项组件

c++ - 测试字节顺序兼容性的工作流程

c++ - 输入从指针接受空格时出现问题

c++ - 从另一个对话框更新对话框时出现问题