如何在C++中的switch语句中使用枚举值

Bot*_*Pgm 38 c++ enums switch-statement

我想enum为一个switch语句使用一个值.是否可以使用所enum包含的值"{}"作为switch()"?我知道switch()需要一个integer值才能将编程流程指向适当的case数字.如果是这种情况,我是否只为每个常量创建一个变量在enum声明中?我还希望用户能够选择并将该选择传递给switch()语句.

例如:

cout << "1 - Easy, ";
cout << "2 - Medium, ";
cout << "3 - Hard: ";

enum myChoice { EASY = 1, MEDIUM = 2, HARD = 3 };

cin >> ????

switch(????)
{
case 1/EASY:  // (can I just type case EASY?)
    cout << "You picked easy!";
    break;

case 2/MEDIUM: 
    cout << "You picked medium!";
    break;

case 3/HARD: // ..... (same thing as case 2 except on hard.)

default:
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*man 33

您可以像整数一样使用枚举值:

myChoice c;

...

switch( c ) {
case EASY:
    DoStuff();
    break;
case MEDIUM:
    ...
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*erg 18

你走在正确的轨道上.您可以将用户输入读取为整数,switch然后:

enum Choice
{
  EASY = 1, 
  MEDIUM = 2, 
  HARD = 3
};

int i = -1;

// ...<present the user with a menu>...

cin >> i;

switch(i)
{
  case EASY:
    cout << "Easy\n";
    break;
  case MEDIUM:
    cout << "Medium\n";
    break;
  case HARD:
    cout << "Hard\n";
    break;
  default:
    cout << "Invalid Selection\n";
    break;
}
Run Code Online (Sandbox Code Playgroud)


rad*_*man 8

有些事情需要注意:

你应该总是在命名空间中声明你的枚举,因为枚举不是正确的命名空间,你会想要像它们一样使用它们.

在每个switch子句的末尾总是有一个中断,否则执行将继续向下结束.

始终default:在开关中包含外壳.

为清晰起见,使用枚举类型的变量来保存枚举值.

请参阅此处,了解在C++中正确使用枚举的讨论.

这就是你想要做的.

namespace choices
{
    enum myChoice 
    { 
        EASY = 1 ,
        MEDIUM = 2, 
        HARD = 3  
    };
}

int main(int c, char** argv)
{
    choices::myChoice enumVar;
    cin >> enumVar;
    switch (enumVar)
    {
        case choices::EASY:
        {
            // do stuff
            break;
        }
        case choices::MEDIUM:
        {
            // do stuff
            break;
        }

        default:
        {
            // is likely to be an error
        }
    };

}
Run Code Online (Sandbox Code Playgroud)

  • 整体+1,但我不同意`总是提供默认:`的情况.据我所知,目的是触发已知错误,以便稍后在枚举中添加新的枚举值时可以轻松纠正错误.我更喜欢实际处理输入以保证用户数据的正确性,并且不提供`default`标记,而是让编译器在有任何超出所有测试用例的值时警告switch语句.这样您就可以获得更快的错误报告:如果将值添加到枚举中,编译器将会抱怨. (2认同)

Ara*_*raK 6

您可以使用a std::map将输入映射到enum:

#include <iostream>
#include <string>
#include <map>
using namespace std;

enum level {easy, medium, hard};
map<string, level> levels;

void register_levels()
{
    levels["easy"]   = easy;
    levels["medium"] = medium;
    levels["hard"]   = hard;
}

int main()
{
    register_levels();
    string input;
    cin >> input;
    switch( levels[input] )
    {
    case easy:
        cout << "easy!"; break;
    case medium:
        cout << "medium!"; break;
    case hard:
        cout << "hard!"; break;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*ner 0

用户的输入始终以字符串的形式提供给您...如果您想将用户的输入从字符串转换为整数,您需要提供代码来执行此操作。如果用户输入一个数字(例如“1”),则可以将字符串传递给atoi()以获取该字符串对应的整数。如果用户输入英文字符串(例如“EASY”),那么您需要检查该字符串(例如使用 strcmp()),并根据检查匹配的情况将适当的整数值分配给您的变量。一旦获得了从用户输入字符串派生的整数值,就可以像往常一样将其传递到 switch() 语句中。

  • 将输入从字符串转换为整数的代码是 `int i; cin &gt;&gt; i;`。这不是 C,所以没有必要乱搞 C 库。 (2认同)