2011-12-27 33 views
7

可能重複:
Easy way to use variables of enum types as string in C?C:地圖串ENUM

有沒有用戶輸入的字符串轉換爲一個ENUM值的任何優雅的方式是直C,除了手工方式。

調用一個函數,它接受一個ENUM作爲參數的簡化示例:

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

由於

+1

我想你的意思是'strcmp'而不是'strcpy'? – cnicutar

+1

@bobbymcr這不是一個騙局;這個問題是相似的,但它是相反的方式(字符串枚舉的枚舉爲字符串)。 – 2011-12-27 09:46:02

+0

[在C中使用枚舉類型的變量作爲字符串的簡單方法](http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in -c)用於獲取ENUM的名稱,使用ENUM值作爲輸入。我需要使用ENUM名稱作爲輸入來獲取ENUM值。 – squater

回答

16
$ 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 

是我最喜歡做這種事情的方法。這確保了enum和映射陣列之間不會發生一致性錯誤。

+3

+1的簡單解決方案。對於將不可讀的宏內容隱藏到應用程序員的更通用的解決方案,請參閱http://p99.gforge.inria.fr/p99-html/group__types.html –

4

否,就沒有其他的方式;因爲enum在機器內部只有一些數字。你可以使用一些預處理技巧。見this question