C语言-枚举类型转字符串表

C语言-枚举类型转字符串表

C语言-枚举类型转字符串表_c_blog_4_202412242050

内容介绍

  1. 定义枚举绑定字符串的结构体:TEnumTypeString

  2. 定义枚举转字符串表类型:TEnumTypeStringTable

  3. 实现表的增加、删除、查询操作

  4. 注意事项

    1. 宏定义过大时,要在堆上开辟内存;
    2. 删除操作,后边的元素前移,元素很多时,注意性能;
    3. 本质上是数组的遍历访问,结构体: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

参考资料(向原创作者致谢)

转载说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值