Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C: Map string to ENUM [duplicate]

Tags:

c

Possible Duplicate:
Easy way to use variables of enum types as string in C?

Is there any elegant way to convert a user input string to an ENUM value is straight C, besides the manual way.

A simplified example of calling a function that takes an ENUM as an argument:

enum = {MONDAY,TUESDAY,WEDNESDAY};

...

//Get user to enter a day of the week from command line
...

//Set the work day according to user input
if (strcmp(user_input,"MONDAY")==0){
   SET_WORK_DAY(MONDAY);
} else if (strcmp(user_input,"TUESDAY")==0){
  SET_WORK_DAY(TUESDAY);
}
...

Thanks

like image 961
squater Avatar asked Dec 27 '11 09:12

squater


2 Answers

$ cat wd.c
#include <stdio.h>

#define mklist(f) \
    f(MONDAY) f(TUESDAY) f(WEDNESDAY)

#define f_enum(x) x,
#define f_arr(x) {x, #x},

enum weekdays { mklist(f_enum) WD_NUM };

struct { enum weekdays wd; char * str; } wdarr[] = { mklist(f_arr) };

int main(int argc, char* argv[]) {
    int i;
    for (i=0; i < sizeof(wdarr)/sizeof(wdarr[0]); i++) {
        if (strcmp(argv[1], wdarr[i].str) == 0) {
            printf("%d %s\n", wdarr[i].wd, wdarr[i].str);
            return 0;
        }
    }
    printf("not found\n");
    return 1;
}
$ make wd
cc     wd.c   -o wd
$ ./wd MONDAY
0 MONDAY
$ ./wd TUESDAY
1 TUESDAY
$ ./wd FOODAY
not found

is my favorite way to do such things. This ensures that no consistency errors can occur between the enum and the mapping array.

like image 162
glglgl Avatar answered Nov 15 '22 16:11

glglgl


No, there is no other way; because an enum is, inside the machine, just some number. You could use some preprocessor tricks. See this question.

like image 36
Basile Starynkevitch Avatar answered Nov 15 '22 16:11

Basile Starynkevitch