如何在没有地图的enum和cstring之间转换?

时间:2018-06-26 17:09:03

标签: c++ enums

我以前看过这个答案,但是使用地图或矢量,但是我不能在项目中使用外部库,因此我需要找出另一种方法。为了将其转换为cstring,我使用了带有开关大小写的函数,并且可以正常工作,但是从cstring转换为枚举并没有按计划进行。

我想出的将cstring转换为枚举的方法是先将枚举转换为int(无,第一,第二等。变为0、1、2等),这样我可以使用for循环遍历不同的枚举。接下来,使用enum to cstring函数,将传入的字符串与转换函数给定的字符串进行比较。如果它们相等,则设置枚举。这似乎是一种令人费解的方法,而且毫不奇怪,我无法使其正常工作。

这是我所有的测试代码,setType函数是出问题的地方。

enum type { none, first, second, third, fourth };

const char* typeName(type name);
type setType(char* name);                   // trouble here
int myStrComp(const char *str1, const char *str2);  // compare cstrings

int main() {                                // test the function
    char testName[] = "second";
    type testType = setType(testName);
    std::cout << typeName(testType) << std::endl;   // should print "second"
}

const char* typeName(type name) {           // convert enum to cstring
    switch (name) {
    case none:      return '\0';        break;
    case first:     return "first";     break;
    case second:    return "second";    break;
    case third:     return "third";     break;
    case fourth:    return "fourth";    break;
    }
}

type setType(char* name) {
    type temp;
    for (int i = 0; i < 4; i++) {       // I know, inefficient
        temp = static_cast<type>(i);    // but there's only 5 to check
        if (myStrComp(name, typeName(temp)) == 0) {
            return temp;
        }
    }
    return none;    // shouldn't get here
}

int myStrComp(const char *str1, const char *str2) {
    while (*str1 == *str2) {
        if (!*str1) {
            return 0;           // strings are equal
        }
        str1++;
        str2++;
    }
    return *str1 - *str2;   // how different are they alphabetically
}

2 个答案:

答案 0 :(得分:1)

case none:      return '\0';        break;

此命令具有单引号,因此它返回字符\0,它的整数等于0。转换为指针时,它是a null pointer。当您尝试在myStrComp()中取消引用空指针时,会发生an access violation

相反,您可以使用return "";返回一个空字符串。

简化typeName的可能方法是使用数组:

const char* typeName[] = {"", "first", "second", "third", "fourth"};
if (myStrComp(name, typeName[i]) == 0) 

(如果i超出范围,将导致访问冲突。)

答案 1 :(得分:1)

要回答您的问题,您可以使用查找表将enum与文本相关联:

struct Entry
{
  type  enum_type;
  const char * enum_text;
};

Entry enum_conversion_table[] =
{
    {none, "none"},
    {first, "first"},
    {second, "second"},
    {third,  "third"},
    {fourth, "fourth"},
};
static const size_t conversion_table_capacity =
    sizeof(conversion_table) / sizeof(conversion_table[0]);

enum转换为文本:

  1. 在表中搜索包含键枚举的条目。
  2. 返回指向条目文本字段的指针(如果找到),或者返回nullptr(如果找不到)。

从文本转换为enum

  1. 在表中搜索包含关键枚举文本的条目。
  2. 返回枚举值(如果找到),或为“未知”创建另一个枚举值并将其返回。

此技术:
1.不使用任何库。
2.可以将数据放入常量数据部分中并存储到只读存储器中。
3.代码可以直接访问数据。
4.数据在main()之前初始化。