我想知道什么会更好: 枚举声明或字符串数组:
enum MonthName{January, February, March, April, May, June, ...)
或
string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...)
因为对我而言似乎并不重要。
此变量只能由一个函数访问,以根据输入的数字显示月份。
答案 0 :(得分:8)
如果您想显示当月的名称,enum
对您没有任何好处。枚举类型定义中的标识符仅对编译器可见;你不能在运行时打印它们。
您需要字符串数组(或者可能是const char*
s的数组)。
使用strftime()
中声明的<ctime>
函数(来自C标准库的<time.h>
标题),也可以通过标准库获取月份的名称。使用strftime()
获取给定月份数的月份名称并不简单(您必须先构建struct tm
个对象)。它确实具有为当前区域设置使用月份名称而不是硬连线到英语的优势。
不要忘记数组索引从0开始; 12月是指数11,而不是12。
答案 1 :(得分:1)
这很重要。如果需要可打印文本,请使用字符串数组。枚举不会转换为可读的名称;它们只是不可或缺的价值观。
答案 2 :(得分:0)
枚举和数组之间没有任何共同之处。 使用枚举,您无法打印月份名称,这只是一个整数......
在您的情况下,您应该使用
static const char* MonthName[2] = {"January", "February", ...};
答案 3 :(得分:0)
在这种情况下枚举和字符串都不同,会产生不同的结果。在枚举的情况下,您可以将月份名称与月份名称存储在枚举类型的变量中,例如
MonthName mn = March;
变量mn
将带有整数值2
。
如果是带有月份名称的字符串数组,则需要将月份数指定为数组索引,并且您将获得的是月份的字符串名称,而不是月份数字,例如。
string mn = MonthName[2];
变量mn
将带有字符串"March"
,可用于显示月份。
但是,您可以更好地使用枚举和字符串数组,例如
string mn = MonthName[March];
此处,枚举March
将充当字符串数组MonthName
的索引并返回"March"
。
答案 4 :(得分: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);
}
两个优化:
std::map
以加快转化速度。