1

私は何が良いのだろうかと思っていました:列挙型宣言または文字列配列:

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

また

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

私にはそれが重要ではないように思われるからです。

この変数は、入力された数値に基づいて月を表示するために、1つの関数によってのみアクセスされます。

4

5 に答える 5

8

月の名前を表示したい場合、 は何のenum役にも立ちません。列挙型定義の識別子は、コンパイラにのみ表示されます。実行時にそれらを印刷することはできません。

文字列の配列 (または s の配列const char*) が必要です。

月の名前は、 (C 標準ライブラリのヘッダーから)strftime()で宣言された関数を使用して、標準ライブラリからも利用できます。を使用して特定の月番号の月名を取得するのは簡単ではありません (最初にオブジェクトを作成する必要があります)。英語に固定されているのではなく、現在のロケールの月名を使用できるという利点があります。<ctime><time.h>strftime()struct tm

また、配列のインデックスは 0 から始まることを忘れないでください。12 月の指数は 12 ではなく 11 です。

于 2012-12-13T19:10:15.843 に答える
1

それは非常に重要です。印刷可能なテキストが必要な場合は、文字列の配列を使用してください。列挙は、読み取り可能な名前に変換されません。それらは単なる整数値です。

于 2012-12-13T19:11:02.973 に答える
0

の表を使用して、2 つを組み合わせることをお勧めします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);
}

2 つの最適化:

  1. std::map変換を高速化するには、テーブルを にロードします。
  2. 1 月より前にヌルの未使用のエントリを変換テーブルに追加し、月番号を使用してテーブルにインデックスを付けます。配列にはインデックスと値の間に暗黙の関係があるため、上記の方法は配列にインデックスを付けるよりも堅牢です。上記の例は、ID と名前の間の明示的な関係を示しています。
于 2012-12-13T19:31:49.153 に答える
0

この場合、列挙型と文字列の両方が異なり、異なる結果が生成されます。列挙型の場合、列挙型の変数に月名と一緒に月番号を格納できます。

MonthName mn = March;

変数mnは整数値を保持します2。月名を持つ文字列の配列の場合、月番号を配列インデックスとして指定する必要があり、取得するのは月番号ではなく月の文字列名です。

string mn = MonthName[2];

変数mnは文字列を保持し、"March"月を表示するために使用できます。ただし、列挙型と文字列配列の両方をより良い方法で使用できます。

string mn = MonthName[March];

ここで、enumMarchは文字列配列のインデックスとして機能しMonthName"March".

于 2012-12-13T19:15:45.330 に答える
0

enum と array の間に共通点はありません。列挙型では、月の名前を出力できません。これは単なる整数です...

あなたの場合、使用する必要があります

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