2012-12-13 106 views
1

我想知道什麼會更好: 枚舉聲明或字符串數​​組:枚舉與陣列

enum MonthName{January, February, March, April, May, June, ...) 

string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...) 

因爲對我來說似乎是它的問題不。

此變量只能被一個函數訪問,以顯示月份爲基礎的數字輸入。

+0

如果顯示它,字符串數組會更好。您無法自動將枚舉項目的名稱轉換爲字符串。 – chris

+4

哪個更好,汽車還是披薩?這些做了兩件完全不同的事情。 –

+4

@PeteBecker很簡單...披薩。 –

回答

7

如果你想顯示該月的enum不會對你有任何好處。枚舉類型定義中的標識符僅對編譯器可見;你不能在運行時打印它們。

您需要字符串數組(或可能是數組const char*)。

還可以通過標準庫使用<ctime>(來自C標準庫的<time.h>標頭)中聲明的strftime()函數獲得月份的名稱。使用strftime()獲取給定月份編號的月份名稱並不簡單(您必須先建立一個struct tm對象)。它具有使用當前語言環境的月份名稱而不是硬連接到英語的優勢。

並且不要忘記數組索引從0開始; 12月在索引11,而不是12.

0

枚舉和數組之間沒有什麼共同之處。 有了你無法打印該月的名稱的枚舉,這僅僅是一個整數...

在你的情況,你應該使用

static const char* MonthName[2] = {"January", "February", ...}; 
+1

@BenVoigt:這在C++中有效嗎?看起來更像C#給我。 –

+0

@Keith:哎呀,我回答關於兩者的問題,混淆了。我認爲這是使用'string'(而不是'std :: string')。 –

+0

現在有道理,謝謝 – Stablecannon

1

這很重要。如果您需要可打印文本,請使用字符串數組。枚舉不會轉換成可讀的名稱;他們只是整體價值。

0

枚舉和字符串在這種情況下是不同的,並會產生不同的結果。在枚舉的情況下,您可以將月份編號與月份名稱一起存儲在枚舉類型的變量中,例如

MonthName mn = March; 

可變mn將攜帶整數值2。 如果使用月份名稱的字符串數組,您需要指定月份編號作爲數組索引,您將得到的是月份的字符串名稱,而不是月份編號,例如

string mn = MonthName[2]; 

可變mn將攜帶串"March",並且可以用於顯示一個月。 但是,您可以更好地使用枚舉和字符串數組,例如

string mn = MonthName[March]; 

這裏,枚舉March將作爲字符串數組MonthName的索引,並返回"March"

+1

不要命名變量'__mn'。包含兩個連續下劃線的名稱保留給實現。所以,以下劃線開頭的名字後跟一個大寫字母。 –

+0

感謝您的評論。我知道它,但無意中在這裏使用它。將繼續爲未來... – liquidcoder

0

我建議兩者結合,採用structs表:

enum Months 
{ 
    JANUARY = 1, 
    FEBRUARY, 
    APRIL, 
//... 
    DECEMBER, 
    NUMBER_OF_MONTHS 
}; 

struct Month_Enum_Conversion_Entry 
{ 
    Months    month_id; 
    char const * const month_name; 
}; 

Month_Enum_Conversion_Entry month_conversion_table[] = 
{ 
    {JANUARY, "January"}, 
    {FEBRUARY, "February"}, 
//... 
    {DECEMBER, "December"} 
}; 
static const unsigned int NUM_TABLE_ENTRIES = 
    sizeof(month_conversion_table)/sizeof(month_conversion_table[0]); 

要枚舉轉換爲文本,在表格中搜索枚舉並訪問文本字段:

std::string Month_ID_To_Name(Months m) 
{ 
    char const * p_month_name = NULL; 
    for (unsigned int i = 0; i < NUM_TABLE_ENTRIES; ++i) 
    { 
     if (month_conversion_table[i].month_id == m) 
     { 
      p_month_name = month_conversion_table[i].month_name; 
      break; 
     } 
    } 
    return std::string(p_month_name); 
} 

兩個優化:

  1. 將表加載到std::map以加快轉換。
  2. 在1月份之前在轉換表中添加一個空的未使用的條目,然後使用月份編號索引 。上述方法 比索引到數組更穩健,因爲該數組具有索引和值之間的隱含關係。上面的示例 提供了ID和名稱之間的明確關係。