代码之家  ›  专栏  ›  技术社区  ›  Mohamad Moustafa

创建一个接受枚举变量并返回字符串指针的函数

  •  0
  • Mohamad Moustafa  · 技术社区  · 7 年前

    我需要创建一个函数,该函数接受一个表示星期几的枚举变量作为参数,并返回一个带有日期名称的字符串指针。

    这是我的代码:

    char *week(enum DAY x);
    
    enum DAY {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};
    
    void main()
    {
    char *date;
    date = week(Monday);
    
    printf("%s",date);
    }
    
    
    char *week(enum DAY x) {
    
    char date[20];
    
    switch (x)
    {
    case Monday:
        strcpy(date,"Monday");
        break;
    case Tuesday:
        strcpy(date,"Tuesday");
        break;
    case Wednesday:
        strcpy(date,"Wednesday");
        break;
    case Thursday:
        strcpy(date,"Thursday");
        break;
    case Friday:
        strcpy(date,"Friday");
        break;
    case Saturday:
        strcpy(date,"Friday");
        break;
    case Sunday:
        strcpy(date,"Friday");
        break;
    }
    return date;
    }
    

    当我运行它时,控制台会打印符号。非常感谢您的帮助。

    此外,是否可以将枚举变量作为用户输入,而不是直接通过编译器输入?

    3 回复  |  直到 7 年前
        1
  •  3
  •   DrC    7 年前

    基本问题是函数返回在堆栈上分配的字符数组。此内存被其他操作覆盖。在main中分配缓冲区,然后将其传递给函数,或者只返回字符串常量。

    对于第二个问题,答案是否定的。枚举实际上只是整数,在编译时有一堆语义检查。

        2
  •  1
  •   Jose Fernando Lopez Fernandez    7 年前

    已经有一些很好的答案,但没有人实现 const char* array[] 正如David C.Rankin在评论中所说:

    创建一个全局指针数组,指向包含日期的字符串文字,例如const char*days[]={“周一”、“周二”、…},然后返回天[x];

    我很惊讶这不是“go-to”的实现,我很好奇为什么每个不同意的人都这么说。同时,此实现看起来是这样的:

    const char* daysOfTheWeek[] = { 
        "Monday", 
        "Tuesday", 
        "Wednesday", 
        "Thursday", 
        "Friday", 
        "Saturday", 
        "Sunday"
    };
    

    因此,实现一个函数以返回一周中的指定日期很简单:

    void PrintDayOfTheWeek(int n) {
        if ((n < 0) || (n > 6)) {
            // TODO: Handle error here somehow
            // Currently ignores call with invalid parameter
    
            return;
        }
    
        printf("Day %d: %s\n", n+1, daysOfTheWeek[n]);
    }
    

    为了测试这一点,您可以通过 for 从0循环到6。

    int main()
    {
        for (int i = 0; i < 7; ++i) {
            PrintDayOfTheWeek(i);
        }
    
        return EXIT_SUCCESS;
    }
    

    输出:

    Day 1: Monday
    Day 2: Tuesday
    Day 3: Wednesday
    Day 4: Thursday
    Day 5: Friday
    Day 6: Saturday
    Day 7: Sunday
    

    现在,在您的问题中,您特别要求使用 enum [值]并返回字符串指针。实现这一点与前面的示例非常相似。我们首先声明 enum DAYS :

    typedef enum DAYS {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    } Day;
    

    方便地, enums 赋值为零( 0 )对于其第一个值,除非另有指定 枚举 与我们的 PrintDayOfTheWeek(int n) 作用

    因此,举例来说,我们现在可以定义一个新函数,它可以在我们想要的日期接收数据,而不是直接用数字调用它 returns the string ,按您的要求。因此,只需传入 枚举天数 :

    const char* dayOfTheWeek(Day day) {
        return daysOfTheWeek[day];
    }
    

    我们可以这样打印:

    printf("%s\n", dayOfTheWeek(SUNDAY));
    

    输出:

    Sunday
    

    这里也有一些很酷的东西。枚举最好用在switch语句中,显然,这在技术上是可能的 to iterate over an enum ,如下所示:

    for (Day day = MONDAY; day <= SUNDAY; ++day) {
        PrintDayOfTheWeek(day);
    }
    

    虽然 枚举 显然是 not meant to be iterated over ,我认为这个例子很酷,因为我认为它有助于记住枚举只是整型数据类型。它们也没有提供额外的类型安全性,这就是为什么将枚举类添加到C++中的原因。

        3
  •  0
  •   Stargateur    7 年前

    你的 main() 函数应返回 int ,则, date 是本地数组,请在外部使用 week() 函数是未定义的行为。您必须更改使用动态分配或具有静态生存时间的字符串返回结果的方式。

    由于您的问题也是关于良好实践的,我将按如下方式实现您的功能:

    #include <stdio.h>
    
    enum DAY {
        Monday = 0,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday,
        Sunday
    };
    
    char const *week(enum DAY x) {
        return (char const *[]) {
            "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
        }[x];
    }
    
    int main(void)
    {
        char const *date = week(Monday);
        printf("%s", date);
    }