c - 在 C 中用其对应的字符串替换预定义的整数

标签 c

为该线程创建标题有点困难,但无论如何,我在 C 代码的开头确实有几个 DEFINE ,如下所示:

#define LOAD  2
#define UP    1
#define STOP  0
#define DOWN -1

它们是我的特定状态图中的状态名称。现在,我需要使用 printf 命令打印这些州名称,但我不知道如何检索州名称的文本等效项。例如,假设 state 最初声明为:

int state = STOP;

我想要这样的东西:

printf("Current State: %s,  state);

其结果是:

Current State: STOP

我知道我可以用四个 if 来模仿这个,但我想知道是否有更简单的方法来实现这一点。

谢谢

最佳答案

如果您确实需要将状态保持为 DOWN 以获得值 -1,则在使用它访问数组元素时必须特别小心。

鉴于您的状态值在 [-1 .. N-1] 范围内,您只需向它们添加一个常量 1 即可获得索引 [0 .. N],可用于寻址 a 的元素char* 数组。

const char* const state_names[] = {"down","stop","up","load"};

只有当您有连续的数字序列时,这才有效。如果您稍后添加状态#define WHATEVER 1000,此方法将会失败。当您更改状态值时,您必须相应地重新排序字符串数组。

如果您希望保持与州相关的值的灵活性,我建议使用州名称和值的查找表。

#include <stdio.h>

enum {LOAD, UP, STOP, DOWN};

const char* const state_names[] = 
{
    [LOAD] = "load",
    [UP]   = "up",
    [STOP] = "stop",
    [DOWN] = "down"
};

const int state_values[] = 
{
    [LOAD] = 2,
    [UP]   = 1,
    [STOP] = 0,
    [DOWN] = -1
};

int main()
{
    int state = STOP;

    printf("Current State Name:  %s\n",  state_names[state]);
    printf("Current State Value: %i\n",  state_values[state]);

    return 0;
}

这样,状态的顺序或实际值不再重要,您可以轻松添加更多状态或对它们重新排序,而无需破坏代码。

关于c - 在 C 中用其对应的字符串替换预定义的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32152493/

相关文章:

c - 如何将屏幕坐标转换为简单 2D 游戏的世界坐标?

c - 指向不透明结构数组的指针

c - 在引号内使用变量?

c - 二维动态数组发送到 C 中的函数

python - 使用 Python 子进程命令调用 C 编译器

C++ Conway 的生命游戏 - Cygwin 段错误(核心已转储)

javascript - 如何将多维数组从 Javascript 转换为 C?

c - 在此范围内未声明错误

c - 这两个声明之间有什么区别 :

C++ 确保绝对没有标准输入缓冲