web-dev-qa-db-fra.com

Puis-je afficher la valeur d'une énumération avec printf ()?

Y a-t-il une ligne qui me permet de sortir la valeur actuelle d'un enum?

44
Pieter

En tant que chaîne, non. En tant qu'entier,% d.

Sauf si vous comptez:

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]);

Cela ne fonctionnera pas pour quelque chose comme une énumération de masques de bits. À ce stade, vous avez besoin d'une table de hachage ou d'une autre structure de données plus élaborée.

44
bmargulies
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;
}

Il vous suffit de lancer énum en int!
Sortie: Mon enum Valeur: 2

22
Matthieu

La bonne réponse à cela a déjà été donnée: non, vous ne pouvez pas donner le nom d'une énumération, mais seulement sa valeur.

Néanmoins, juste pour le plaisir, cela vous donnera une énumération et un tableau de recherche tout en un et vous donnera le moyen de l’imprimer par nom:

principal 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;
}

Enum.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

Avertissement: ne faites pas cela.

6
DrAl

Un mec a mis au point une idée de préprocesseur intelligent dans ce post

Un moyen facile d'utiliser des variables de types enum comme chaîne dans C?

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

J'ai eu le même problème. 

Je devais imprimer la couleur des nœuds où la couleur était: enum col { WHITE, GRAY, BLACK }; et le nœud: typedef struct Node { col color; };

J'ai essayé d'imprimer node->color avec printf("%s\n", node->color); mais tout ce que j'ai à l'écran était (null)\n.

La réponse bmargulies a presque résolu le problème.

Donc ma solution finale est:

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