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

时间:2018-04-14 18:06:02

标签: c pointers enums

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

这是我的代码:

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 个答案:

答案 0 :(得分:4)

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

在回答你的第二个问题时,没有。枚举实际上只是在编译时有一堆语义检查的整数。

答案 1 :(得分:1)

您的main()函数应该返回intdate是一个本地数组,在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);
}

答案 2 :(得分:1)

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

  

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

我很惊讶这不是“去”实施,我很想听到每个不同意的人的原因。与此同时,这就是这种实现的样子:

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]);
}

要对此进行测试,您可以遍历从0到6的简单for循环。

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 [value]并返回一个字符串指针。实现这与前面的示例非常相似。我们首先声明enum DAYS

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

方便的是,enums为其第一个值分配值为零(0),除非另有指定,因此enum已经按照我们的PrintDayOfTheWeek(int n)函数正常工作。

因此,例如,我们现在可以根据您的要求定义一个新功能,而不是直接使用数字来调用它,而是this。所以只需传递enum DAYS中定义的星期名称:

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

我们可以这样打印出来:

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

输出:

Sunday

这也很酷。枚举最好用在switch语句中,显然,技术上可以returns the string,如下所示:

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

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