枚举和将月份名称作为字符串返回的函数

Are*_*yan 2 c enums switch-statement

这是练习:

编写一个名为的函数monthName() ,它将一个类型的值作为其参数enum month(如本章所定义),并返回一个指向包含月份名称的字符串的指针.通过这种方式,您可以enum month使用以下语句显示变量的值 :

printf("%s\n", monthName(aMonth));

我写了我的版本并获得了我期望的输出.但是,我确信必须有一个更好的方法来实现它,而不必每个月使用一个case的switch语句.如何用更好的设计编写这个功能?

#include <stdio.h>

enum month { January = 1, February, March, April, May, June, 
        July, August, September, October, November, December };

char *monthName(enum month m){
    switch (m) {
        case January:
            return "January";
            break;
        case February:
            return "February";
            break;
        case March:
            return "March";
            break;
        case April:
            return "April";
            break;
        case May:
            return "May";
            break;
        case June:
            return "June";
            break;
        case July:
            return "July";
            break;
        case August:
            return "August";
            break;
        case September:
            return "September";
            break;
        case October:
            return "October";
            break;
        case November:
            return "November";
            break;
        case December:
            return "December";
            break;
        default:
            return "Not a valid month";
    }
}

int main(void)
{
    enum month aMonth = 1;

    printf("%s\n", monthName(aMonth));

    aMonth = 2;
    printf("%s\n", monthName(aMonth));

    aMonth = 6;
    printf("%s\n", monthName(aMonth));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

您可以创建一个包含字符串的数组,并使用枚举对其进行索引.

const char *monthNames[] = { "Not a valid month", "January", "February", "March", 
                             "April", "May", "June", "July", "August", "September", 
                             "October", "November" "December" };

const char *monthName(enum month m)
{
    if (m < 1 || m > 12) {
        return monthNames[0];   // string for invalid month
    } else {
        return monthNames[m];
    }
}
Run Code Online (Sandbox Code Playgroud)


Pab*_*blo 5

您可以使用简单的查找表,因为枚举以1开头:

#include <stdio.h>

enum month { January = 1, February, March, April, May, June, 
        July, August, September, October, November, December };

const char *months_str[] = {
    "January", "February", "March", "April", "May", "June", "July",
    "August", "September", "October", "November", "December", NULL
};

const char *monthName(enum month m) {
    if(m < January || m > December)
        return "Invalid month";

    return months_str[m-1];
}

int main(void)
{
    enum month aMonth = 1;

    printf("%s\n", monthName(aMonth));

    aMonth = 2;
    printf("%s\n", monthName(aMonth));

    aMonth = 6;
    printf("%s\n", monthName(aMonth));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)