我想知道什麼會更好: 枚舉聲明或字符串數組:枚舉與陣列
enum MonthName{January, February, March, April, May, June, ...)
或
string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...)
因爲對我來說似乎是它的問題不。
此變量只能被一個函數訪問,以顯示月份爲基礎的數字輸入。
我想知道什麼會更好: 枚舉聲明或字符串數組:枚舉與陣列
enum MonthName{January, February, March, April, May, June, ...)
或
string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...)
因爲對我來說似乎是它的問題不。
此變量只能被一個函數訪問,以顯示月份爲基礎的數字輸入。
如果你想顯示該月的名 ,enum
不會對你有任何好處。枚舉類型定義中的標識符僅對編譯器可見;你不能在運行時打印它們。
您需要字符串數組(或可能是數組const char*
)。
還可以通過標準庫使用<ctime>
(來自C標準庫的<time.h>
標頭)中聲明的strftime()
函數獲得月份的名稱。使用strftime()
獲取給定月份編號的月份名稱並不簡單(您必須先建立一個struct tm
對象)。它具有使用當前語言環境的月份名稱而不是硬連接到英語的優勢。
並且不要忘記數組索引從0開始; 12月在索引11,而不是12.
枚舉和數組之間沒有什麼共同之處。 有了你無法打印該月的名稱的枚舉,這僅僅是一個整數...
在你的情況,你應該使用
static const char* MonthName[2] = {"January", "February", ...};
@BenVoigt:這在C++中有效嗎?看起來更像C#給我。 –
@Keith:哎呀,我回答關於兩者的問題,混淆了。我認爲這是使用'string'(而不是'std :: string')。 –
現在有道理,謝謝 – Stablecannon
這很重要。如果您需要可打印文本,請使用字符串數組。枚舉不會轉換成可讀的名稱;他們只是整體價值。
枚舉和字符串在這種情況下是不同的,並會產生不同的結果。在枚舉的情況下,您可以將月份編號與月份名稱一起存儲在枚舉類型的變量中,例如
MonthName mn = March;
可變mn
將攜帶整數值2
。 如果使用月份名稱的字符串數組,您需要指定月份編號作爲數組索引,您將得到的是月份的字符串名稱,而不是月份編號,例如
string mn = MonthName[2];
可變mn
將攜帶串"March"
,並且可以用於顯示一個月。 但是,您可以更好地使用枚舉和字符串數組,例如
string mn = MonthName[March];
這裏,枚舉March
將作爲字符串數組MonthName
的索引,並返回"March"
。
不要命名變量'__mn'。包含兩個連續下劃線的名稱保留給實現。所以,以下劃線開頭的名字後跟一個大寫字母。 –
感謝您的評論。我知道它,但無意中在這裏使用它。將繼續爲未來... – liquidcoder
我建議兩者結合,採用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);
}
兩個優化:
std::map
以加快轉換。
如果顯示它,字符串數組會更好。您無法自動將枚舉項目的名稱轉換爲字符串。 – chris
哪個更好,汽車還是披薩?這些做了兩件完全不同的事情。 –
@PeteBecker很簡單...披薩。 –