C语言-枚举类型转字符串表
C语言-枚举类型转字符串表_c_blog_4_202412242050
内容介绍
-
定义枚举绑定字符串的结构体:TEnumTypeString
-
定义枚举转字符串表类型:TEnumTypeStringTable
-
实现表的增加、删除、查询操作
-
注意事项
- 宏定义过大时,要在堆上开辟内存;
- 删除操作,后边的元素前移,元素很多时,注意性能;
- 本质上是数组的遍历访问,结构体:TEnumTypeString将枚举与字符串绑定在一起;
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define D_ENUM_TYPE_MAX_END 256
#define D_ENUM_STRING_MAX_LENGTH 64
typedef struct TEnumTypeString
{
int enumType;
char enumString[D_ENUM_STRING_MAX_LENGTH];
}TEnumTypeString;
typedef struct TEnumTypeStringTable
{
TEnumTypeString enumTypeArray[D_ENUM_TYPE_MAX_END];
unsigned int enumTypeArrayLength;
}TEnumTypeStringTable;
void printEnumTypeString(const TEnumTypeStringTable* enumTable);
unsigned int registerEnumType(TEnumTypeStringTable* enumTable, const int enumType, const char* enumString);
void unregisterEnumType(TEnumTypeStringTable* enumTable, const int enumType);
int updateEnumType(TEnumTypeStringTable* enumTable, const int enumType, const char* enumString);
int getEnumTypeIndex(const TEnumTypeStringTable* enumTable, const int enumType);
bool enumType2string(const TEnumTypeStringTable* enumTable, const int enumType, char enumSting[D_ENUM_STRING_MAX_LENGTH]);
bool isEnumTypeExist(const TEnumTypeStringTable* enumTable, const int enumType);
int main(int argc, char** argv)
{
static TEnumTypeStringTable enumTable;
enumTable.enumTypeArrayLength = 0;
const int enumCount = 10;
for (int i = 0; i < enumCount; i++)
{
char str[D_ENUM_STRING_MAX_LENGTH] = {0};
sprintf(str, "abcd_%d", i);
registerEnumType(&enumTable, i, str);
}
printEnumTypeString(&enumTable);
for (int i = 0; i < enumCount; i++)
{
if (i % 2 == 0)
{
char str[D_ENUM_STRING_MAX_LENGTH] = {0};
if (enumType2string(&enumTable, i, str))
printf("unregister enum string :%s, index :%d \n", str, getEnumTypeIndex(&enumTable, i));
unregisterEnumType(&enumTable, i);
}
else
{
char str[D_ENUM_STRING_MAX_LENGTH] = { 0 };
sprintf(str, "update_%d", i);
updateEnumType(&enumTable, i, str);
}
}
printEnumTypeString(&enumTable);
return 0;
}
void printEnumTypeString(const TEnumTypeStringTable* enumTable)
{
printf("\n");
printf("print enum type string table, length :%d \n", enumTable->enumTypeArrayLength);
for (int i = 0; i < enumTable->enumTypeArrayLength; i++)
{
printf("%d, enum type :%d, string :%s \n", i, enumTable->enumTypeArray[i].enumType, enumTable->enumTypeArray[i].enumString);
}
printf("\n");
}
unsigned int registerEnumType(TEnumTypeStringTable* enumTable, const int enumType, const char* enumString)
{
if (getEnumTypeIndex(enumTable, enumType) >= 0)
{
return updateEnumType(enumTable, enumType, enumString);
}
enumTable->enumTypeArray[enumTable->enumTypeArrayLength].enumType = enumType;
sprintf(enumTable->enumTypeArray[enumTable->enumTypeArrayLength].enumString, "%s", enumString);
//printf("register enum type :%d, string :%s, index :%d \n", enumType, enumString, enumTable->enumTypeArrayLength);
enumTable->enumTypeArrayLength++;
return enumTable->enumTypeArrayLength - 1;
}
void unregisterEnumType(TEnumTypeStringTable* enumTable, const int enumType)
{
int index = -1;
for (int i = 0; i < enumTable->enumTypeArrayLength; i++)
{
if (enumTable->enumTypeArray[i].enumType == enumType)
{
//printf("unregister enum type :%d, string :%s, index :%d \n", enumType, enumTable->enumTypeArray[i].enumString, i);
index = i;
enumTable->enumTypeArray[i].enumType = -1;
sprintf(enumTable->enumTypeArray[i].enumString, "%s", "");
break;
}
}
if (index < 0)
return;
// 数组元素往前移动
for (int i = index; i < enumTable->enumTypeArrayLength - 1; i++)
{
enumTable->enumTypeArray[i].enumType = enumTable->enumTypeArray[i + 1].enumType;
sprintf(enumTable->enumTypeArray[i].enumString, "%s", enumTable->enumTypeArray[i + 1].enumString);
}
enumTable->enumTypeArrayLength--;
}
int updateEnumType(TEnumTypeStringTable* enumTable, const int enumType, const char* enumString)
{
int index = -1;
for (int i = 0; i < enumTable->enumTypeArrayLength; i++)
{
if (enumTable->enumTypeArray[i].enumType == enumType)
{
//printf("update enum type :%d, string :%s->%s, index :%d \n", enumType, enumTable->enumTypeArray[i].enumString, enumString, i);
index = i;
sprintf(enumTable->enumTypeArray[i].enumString, "%s", enumString);
break;
}
}
return index;
}
int getEnumTypeIndex(const TEnumTypeStringTable* enumTable, const int enumType)
{
for (int i = 0; i < enumTable->enumTypeArrayLength; i++)
{
if (enumTable->enumTypeArray[i].enumType == enumType)
{
return i;
}
}
return -1;
}
bool enumType2string(const TEnumTypeStringTable* enumTable, const int enumType, char enumString[D_ENUM_STRING_MAX_LENGTH])
{
sprintf(enumString, "%s", "");
for (int i = 0; i < enumTable->enumTypeArrayLength; i++)
{
if (enumTable->enumTypeArray[i].enumType == enumType)
{
sprintf(enumString, "%s", enumTable->enumTypeArray[i].enumString);
return true;
}
}
return false;
}
bool isEnumTypeExist(const TEnumTypeStringTable* enumTable, const int enumType)
{
for (int i = 0; i < enumTable->enumTypeArrayLength; i++)
{
if (enumTable->enumTypeArray[i].enumType == enumType)
{
return true;
}
}
return false;
}
运行结果
print enum type string table, length :10
0, enum type :0, string :abcd_0
1, enum type :1, string :abcd_1
2, enum type :2, string :abcd_2
3, enum type :3, string :abcd_3
4, enum type :4, string :abcd_4
5, enum type :5, string :abcd_5
6, enum type :6, string :abcd_6
7, enum type :7, string :abcd_7
8, enum type :8, string :abcd_8
9, enum type :9, string :abcd_9
unregister enum string :abcd_0, index :0
unregister enum string :abcd_2, index :1
unregister enum string :abcd_4, index :2
unregister enum string :abcd_6, index :3
unregister enum string :abcd_8, index :4
print enum type string table, length :5
0, enum type :1, string :update_1
1, enum type :3, string :update_3
2, enum type :5, string :update_5
3, enum type :7, string :update_7
4, enum type :9, string :update_9
参考资料(向原创作者致谢)
- 无
转载说明
- 原创文章,转载请注明出处!
- 本篇博客内容若侵害您的合法权益,请及时在本文评论区联系我们!我们看到后会及时改正。
- 本文原文链接:C语言-枚举类型转字符串表-指艺
- 本文作者的其他文章