1

我想知道什么会更好:枚举声明或字符串数​​组:

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

或者

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

因为对我来说这似乎并不重要。

这个变量只能被一个函数访问,根据输入的数字显示月份。

4

5 回答 5

8

如果你想显示月份的名称enum,那对你没有任何好处。枚举类型定义中的标识符仅对编译器可见;你不能在运行时打印它们。

您需要字符串数组(或者可能是const char*s 数组)。

月份的名称也可以通过标准库使用(来自 C 标准库的头文件)strftime()中声明的函数获得。使用给定月份编号获取月份名称并不简单(您必须先构建一个对象)。它确实具有使用当前语言环境的月份名称而不是硬连线到英语的优势。<ctime><time.h>strftime()struct tm

并且不要忘记数组索引从 0 开始;12 月的指数为 11,而不是 12。

于 2012-12-13T19:10:15.843 回答
1

这很重要。如果您需要可打印的文本,请使用字符串数组。枚举不会转化为可读的名称;它们只是整数值。

于 2012-12-13T19:11:02.973 回答
0

枚举和数组之间没有任何共同点。使用枚举,您无法打印月份的名称,这只是一个整数......

在您的情况下,您应该使用

static const char* MonthName[2] = {"January", "February", ...};
于 2012-12-13T19:09:29.770 回答
0

在这种情况下,枚举和字符串都是不同的,会产生不同的结果。如果是枚举,您可以将月份名称和月份名称存储在枚举类型的变量中,例如

MonthName mn = March;

该变量mn将携带整数值2。如果是带有月份名称的字符串数组,您需要将月份编号指定为数组索引,您将得到月份的字符串名称而不是月份编号,例如

string mn = MonthName[2];

该变量mn将携带字符串"March"并可用于显示月份。但是,您可以以更好的方式同时使用枚举和字符串数组,例如

string mn = MonthName[March];

在这里,枚举March将作为字符串数组的索引MonthName并返回"March".

于 2012-12-13T19:15:45.330 回答
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. 将表加载到 astd::map中以实现更快的转换。
  2. 在一月之前在转换表中添加一个空的、未使用的条目,然后使用月份编号对表进行索引。上述方法比索引到数组更健壮,因为数组在索引和值之间具有隐含的关系。上面的示例提供了 ID 和名称之间的显式关系。
于 2012-12-13T19:31:49.153 回答