将枚举打印为字符串

时间:2014-01-20 20:47:49

标签: c++ c

我实际上在c ++中有一个枚举:

class myClass
{
public:
    enum ExampleType
    {
       TEST1
       TEST2
       TEST3
       TEST4
    }
};

我想将枚举打印为数字而不是字符串.. 实际上它打印 0 .. 1 .. 2 .. 3 我想打印 TEST1 TEST2 等......

我已经尝试将Switch案例改为:

 std::string type;
  switch (this->type)
    {
    case 0:   type = "TEST1";
    case 1:   type = "TEST2";
    case 2: type = "TEST3";
    case 3: type = "TEST4";
    }

然后打印类型,但他没有进入正确的情况..

怎么可能?

4 个答案:

答案 0 :(得分:3)

在C / C ++中,case语句失效。您必须使用break退出switch语句。如果this->type为0,则执行的代码为:

type = "TEST1";
type = "TEST2";
type = "TEST3";
type = "TEST4";

你想要的是:

switch( this->type )
{
case TEST1: type = "TEST1";
            break;
case TEST2: type = "TEST2";
            break;
//...
}

或者,如果您有一个返回此值的函数,只需返回值:

std::string type_string()
{
    switch( this->type )
    {
    case TEST1: return "TEST1";
    case TEST2: return "TEST2";
    //...
    default:    return std::string::empty();
    }
}

注意:(自@ DoxyLover的注释)我改变了开关以使用声明的枚举常量,因为你应该使用它们。如果有人在枚举的开头添加了TEST0,那么switch语句仍会正确执行,而你的版本则不会。

答案 1 :(得分:2)

除了其他答案,您还可以执行以下操作:(C99)

#include <ansi_c.h>

enum ExampleType
{
    TEST1,
    TEST2,
    TEST3,
    TEST4,
    TEST_MAX
};

const char string[TEST_MAX][10]={"TEST1","TEST2","TEST3","TEST4"};


int main(void)
{
    int i;
    for(i=0;i<TEST_MAX;i++)
    {
        printf("%d: %s\n", i, string[i]);   
    }

    return 0;
}

答案 2 :(得分:1)

在switch-case语句中,评估在案例之间进行。这就是if-else的独特之处,其中关键词“else”确保只选择一组指令。在每个案例结尾添加一个休息时间,以防止这是一种良好的做法。

答案 3 :(得分:1)

如果您知道在编译时要打印的内容,可以使用这样的预处理器:

<强>代码

#define STRINGIFY(word) (#word)

int main(void)
{
    printf("%d %s\n", TEST2, STRINGIFY(TEST2)); 

    return 0;
}

<强>输出

  

1 TEST2

大但

然而,这与这样做完全没有区别:

printf("%d TEST2\n", TEST2);