C语言 我可以用printf()显示枚举的值吗?

ifsvaxew  于 2023-04-19  发布在  其他
关注(0)|答案(7)|浏览(159)

有没有一行代码可以让我输出枚举的当前值?

polkgigr

polkgigr1#

enum A { foo, bar } a;
a = foo;
printf( "%d", a );   // see comments below
0dxa2lsx

0dxa2lsx2#

在这篇文章中,一些家伙提出了一个聪明的预处理器的想法
Easy way to use variables of enum types as string in C?

pcww981p

pcww981p3#

我也有同样的问题。
我不得不打印出颜色所在的节点的颜色:enum col { WHITE, GRAY, BLACK };和节点:typedef struct Node { col color; };
我尝试用printf("%s\n", node->color);打印node->color,但屏幕上显示的只有(null)\n
马古利斯的回答几乎解决了这个问题。
所以我的最终解决方案是:

static char *enumStrings[] = {"WHITE", "GRAY", "BLACK"};
printf("%s\n", enumStrings[node->color]);
pb3skfrl

pb3skfrl4#

打印一个枚举值可能会很棘手,因为它的每个成员的大小可能会因实现而异。

#include <stdio.h>

int main(void) {
  enum option {A = 0, B = 0x100000000};

  // Enumerator sizes of the same enumeration can differ
  printf("sizeof(A)=%zu\n", sizeof(A)); // sizeof(A)=4
  printf("sizeof(B)=%zu\n", sizeof(B)); // sizeof(B)=8

  // Same output even though they have different values
  printf("A=%d\n", A); // A=0
  printf("B=%d\n", B); // B=0

  // You should know beforehand the maximum enumerator size
  printf("A=%ld\n", A); // A=0
  printf("B=%ld\n", B); // B=4294967296
}
fbcarpbf

fbcarpbf5#

作为字符串,否。作为整数,%d。
除非你算上:

static char* enumStrings[] = { /* filler 0's to get to the first value, */
                               "enum0", "enum1", 
                               /* filler for hole in the middle: ,0 */
                               "enum2", "enum3", .... };

...

printf("The value is %s\n", enumStrings[thevalue]);

这对于像位掩码枚举这样的东西是不起作用的,这时,你需要一个哈希表或其他一些更复杂的数据结构。

swvgeqrz

swvgeqrz6#

enum MyEnum
{  A_ENUM_VALUE=0,
   B_ENUM_VALUE,
   C_ENUM_VALUE
};

int main()
{
 printf("My enum Value : %d\n", (int)C_ENUM_VALUE);
 return 0;
}

你只需要将枚举转换为int!
输出:我的枚举值:***

rqcrx0a6

rqcrx0a67#

这个问题的正确答案已经给出:不,你不能给予枚举的名称,只能给出它的值。
然而,为了好玩,这将给予你一个枚举和一个查找表,并给你一种按名称打印的方法:
main.c:

#include "Enum.h"

CreateEnum(
        EnumerationName,
        ENUMValue1,
        ENUMValue2,
        ENUMValue3);

int main(void)
{
    int i;
    EnumerationName EnumInstance = ENUMValue1;

    /* Prints "ENUMValue1" */
    PrintEnumValue(EnumerationName, EnumInstance);

    /* Prints:
     * ENUMValue1
     * ENUMValue2
     * ENUMValue3
     */
    for (i=0;i<3;i++)
    {
        PrintEnumValue(EnumerationName, i);
    }
    return 0;
}

枚举h:

#include <stdio.h>
#include <string.h>

#ifdef NDEBUG
#define CreateEnum(name,...) \
    typedef enum \
    { \
        __VA_ARGS__ \
    } name;
#define PrintEnumValue(name,value)
#else
#define CreateEnum(name,...) \
    typedef enum \
    { \
        __VA_ARGS__ \
    } name; \
    const char Lookup##name[] = \
        #__VA_ARGS__;
#define PrintEnumValue(name, value) print_enum_value(Lookup##name, value)
void print_enum_value(const char *lookup, int value);
#endif

Enum.c

#include "Enum.h"

#ifndef NDEBUG
void print_enum_value(const char *lookup, int value)
{
    char *lookup_copy;
    int lookup_length;
    char *pch;

    lookup_length = strlen(lookup);
    lookup_copy = malloc((1+lookup_length)*sizeof(char));
    strcpy(lookup_copy, lookup);

    pch = strtok(lookup_copy," ,");
    while (pch != NULL)
    {
        if (value == 0)
        {
            printf("%s\n",pch);
            break;
        }
        else
        {
            pch = strtok(NULL, " ,.-");
            value--;
        }
    }

    free(lookup_copy);
}
#endif

免责声明:不要这样做。

相关问题