我以前看过这个答案,但是使用地图或矢量,但是我不能在项目中使用外部库,因此我需要找出另一种方法。为了将其转换为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
}
答案 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
转换为文本:enum
:此技术:
1.不使用任何库。
2.可以将数据放入常量数据部分中并存储到只读存储器中。
3.代码可以直接访问数据。
4.数据在main()
之前初始化。