wake-up-neo.com

Kann ich den Wert einer Aufzählung mit printf () anzeigen?

Gibt es einen Einzeiler, mit dem ich den aktuellen Wert einer Enumeration ausgeben kann?

44
Pieter

Als Zeichenfolge nein. Als ganze Zahl% d.

Wenn Sie nicht zählen:

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

Dies funktioniert nicht für so etwas wie eine Aufzählung von Bitmasken. An diesem Punkt benötigen Sie eine Hashtabelle oder eine andere, aufwendigere Datenstruktur.

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

Sie müssen nur Enum to Int!
Ausgabe: Mein Enumewert: 2

22
Matthieu

Die richtige Antwort darauf wurde bereits gegeben: Nein, Sie können nicht den Namen einer Aufzählung angeben, nur den Wert.

Trotzdem, nur zum Spaß, erhalten Sie eine Auflistung und eine Nachschlagetabelle in einem und geben Ihnen die Möglichkeit, den Namen nach Namen auszudrucken:

haupt 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

Haftungsausschluss: Tu das nicht.

6
DrAl

Ein Typ hat in diesem Beitrag eine clevere Präprozessor-Idee gefunden

Einfache Möglichkeit, Variablen von Enummentypen als Zeichenfolge in C zu verwenden?

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

Ich hatte das gleiche Problem. 

Ich musste die Farbe der Knoten drucken, an denen die Farbe war: enum col { WHITE, GRAY, BLACK }; und der Knoten: typedef struct Node { col color; };

Ich habe versucht, node->color mit printf("%s\n", node->color); zu drucken, aber alles, was ich auf dem Bildschirm sah, war (null)\n.

Die Antwort bmargulies gab das Problem fast gelöst.

Meine endgültige Lösung ist also:

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