2015-11-29 47 views
1

我想將字符串轉換爲枚舉數。下面的代碼是我想要做的。如何將字符串轉換爲枚舉數?

#define SELECT_DAY(s) s 

enum sched {MON, TUE, WED}; 
int main(void) 
{ 
    char *str = "TUE"; 

    printf("%d\n", SELECT_DAY(str)); 
    return 0; 
} 

正如你所看到的,str有「TUE」字符串的指針。所以,我認爲printf函數會打印出數字1.但是,它打印出字符串的地址。

printf("%d\n", TUE); 

上面的代碼是我的預期。前輩不能處理這個操作嗎? 我知道在C#中將字符串轉換爲枚舉的方式是可能的。在C中,有沒有辦法將一個字符串轉換爲枚舉數?

+0

[C:地圖串ENUM]的可能的複製(HTTP: //sketoverflow.com/questions/8642970/c-map-string-to-enum) –

+0

什麼是「前任」?順便說一下,預處理器不會執行這樣的轉換,因爲這不是它的任務,並且處理器(CPU)不會執行這樣的轉換,因爲枚舉中使用的符號不會出現在可執行文件中,除非作爲調試符號。 – MikeCAT

+0

[在C中使用枚舉類型的變量作爲字符串的簡單方法]可能的重複(http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-字符串在-c)的 – MikeCAT

回答

1

那麼,在C世界裏,這是DIY。

沒有「明顯」的方式做到這一點,通常人們使用類似:

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

enum sched {MON, TUE, WED}; 

static const struct { 
    enum sched val; 
    const char *const str; 
} enum_2_string_map[] = { 
    { MON, "MON" }, 
    { TUE, "TUE" }, 
    { WED, "WED" } 
}; 

enum sched string2enum(const char *str) 
{ 
    int i; 
    for (i = 0; i < sizeof(enum_2_string_map)/sizeof(*enum_2_string_map); i++) { 
     if (strcmp(str, enum_2_string_map[i].str) == 0) { 
      return enum_2_string_map[i].val; 
     } 
    } 
    /* you need to decide what to do if string is not found; assert or return a 
    * default value... you choose */ 
    abort(); 
} 

#define SELECT_DAY(s) string2enum(s) 

int main(void) 
{ 
    char *str = "TUE"; 

    printf("%d\n", SELECT_DAY(str)); 
    return 0; 
} 

你可能會看到實現用宏,以防止重複{ MON, "MON" }(例如)或其他不屬於區分大小寫,但或多或​​少總是以相同的方式。

有的還創建一個字符串數組,他們與枚舉值指標,但我不喜歡這樣做(枚舉並不總是連續的)