如何以编程方式将整数映射到const字符串?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式将整数映射到const字符串?相关的知识,希望对你有一定的参考价值。

我有一堆错误代码(0,1,10,11,20,30,40,...),我需要映射到相应的错误消息。由于错误代码不能方便地用作数组中的indeces(它将是稀疏和浪费的),我认为这可以通过宏和/或枚举以某种方式完成。

我基本上试图创建一个函数const char *my_strerror(int errorcode)

const char *err00 = "an error message";
const char *err01 = "a different one";
const char *err10 = "another one";

const char* chatter_strerror(int error){
    switch(error){
        case 0:
            return err00;
        case 1:
            return err01;
        case 10:
            return err10;

        .... // 10 more cases
    }
}

当然有更优雅的方式来做到这一点?

答案

一种解决方案是创建一个错误消息结构,其中包含错误代码的int字段和错误消息的char *字段。然后可以使用错误代码和消息初始化错误消息structs数组。这种方法可以很容易地使用新的错误消息更新代码,如果错误消息数组中的最终struct用作.msg字段中带空指针的标记,则迭代数组的函数将不需要知道它包含多少元素。

这是一个例子。 get_error()函数在数组上循环,在遇到所需的错误代码时突破循环。如果达到了标记值并且未找到匹配项,则返回“无法识别的错误代码”消息。请注意,在将新的错误消息添加到get_error()数组时,无需修改error_codes[]函数。

#include <stdio.h>

struct Errors
{
    const char *msg;
    int code;
};

struct Errors error_codes[] = {
    { .code = 1,  .msg = "input error" },
    { .code = 5,  .msg = "format error" },
    { .code = 10, .msg = "allocation error" },
    { .msg = NULL }
};

const char * get_error(int err_code);

int main(void)
{
    printf("Error: %s
", get_error(1));
    printf("Error: %s
", get_error(5));
    printf("Error: %s
", get_error(10));
    printf("Error: %s
", get_error(-1));

    return 0;
}

const char * get_error(int err_code)
{
    struct Errors *current = error_codes;
    const char *ret_msg = "Unrecognized error code";

    while (current->msg) {
        if (current->code == err_code) {
                ret_msg = current->msg;
                break;
        }
        ++current;
    }

    return ret_msg;
}

OP指定了int错误代码,但也提到了enums。这是使用enum的修改。在这里使用enum的一个优点是增加了可读性。缺点是当错误消息改变时,现在必须在两个地方修改代码。

#include <stdio.h>

/* Modify both the Error_Codes enum  and the following error_codes[] array
   when adding new error messages. */

enum Error_Codes {
    ERRINPUT  = 1,
    ERRFORMAT = 5,
    ERRALLOC  = 10
};

struct Errors
{
    const char *msg;
    enum Error_Codes code;
};

struct Errors error_codes[] = {
    { .code = ERRINPUT,  .msg = "input error" },
    { .code = ERRFORMAT, .msg = "format error" },
    { .code = ERRALLOC,  .msg = "allocation error" },
    { .msg = NULL }
};

const char * get_error(enum Error_Codes err_code);

int main(void)
{
    printf("Error: %s
", get_error(ERRINPUT));
    printf("Error: %s
", get_error(ERRFORMAT));
    printf("Error: %s
", get_error(ERRALLOC));
    printf("Error: %s
", get_error(-1));

    return 0;
}

const char * get_error(enum Error_Codes err_code)
{
    struct Errors *current = error_codes;
    const char *ret_msg = "Unrecognized error code";

    while (current->msg) {
        if (current->code == err_code) {
                ret_msg = current->msg;
                break;
        }
        ++current;
    }

    return ret_msg;
}

节目输出:

Error: input error
Error: format error
Error: allocation error
Error: Unrecognized error code

以上是关于如何以编程方式将整数映射到const字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式创建 RAM 磁盘?

以编程方式添加 UIConstraints 时不应用尾随约束

如何以编程方式将字符串和键添加到 iPhone 中的字典?

如何以编程方式将文件上传到 Windows Server 2003 远程桌面

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift)

以整数为键并映射到 void 指针的 C 映射/哈希表