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

C 创建一个接受枚举变量并返回字符串指针的函数,c,pointers,enums,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 *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;
}
当我运行它时,控制台会打印符号。非常感谢您的帮助


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

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


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

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

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

您的
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);
}
#包括
枚举日{
星期一=0,
星期二
星期三
星期四
星期五
星期六
星期日
};
字符常量*周(枚举日x){
返回(字符常量*[]){
“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”、“星期日”
}[x] );
}
内部主(空)
{
字符常量*日期=周(星期一);
printf(“%s”,日期);
}
你的
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);
}
#包括
枚举日{
星期一=0,
星期二
星期三
星期四
星期五
星期六
星期日
};
字符常量*周(枚举日x){
返回(字符常量*[]){
“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”、“星期日”
}[x] );
}
内部主(空)
{
字符常量*日期=周(星期一);
printf(“%s”,日期);
}

已经有了一些很好的答案,但是没有人实现了
常量字符*数组[]
。正如David C.Rankin在评论中所说:

创建一个全局指针数组,指向包含日期的字符串文本,例如const char*days[]={“星期一”、“星期二”…},然后只返回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]);
}
输出:

Day 1: Monday
Day 2: Tuesday
Day 3: Wednesday
Day 4: Thursday
Day 5: Friday
Day 6: Saturday
Day 7: Sunday
Sunday
现在,在您的问题中,您特别要求使用一个函数,该函数接受
enum
[value],并返回一个字符串指针。实现这一点与前面的示例非常相似。我们首先声明
枚举天数

typedef enum DAYS {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
} Day;
const char* dayOfTheWeek(Day day) {
    return daysOfTheWeek[day];
}
方便的是,
enum
为它们的第一个值指定一个零(
0
)值,除非另有指定,因此此
enum
已与我们的
printDayOfWeek(int n)
函数一样工作

因此,例如,我们现在可以定义一个新函数,根据您的要求,在我们想要的日期接收数据,而不是直接用数字调用它。因此,只需传入
枚举天数中定义的周名称即可:

typedef enum DAYS {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
} Day;
const char* dayOfTheWeek(Day day) {
    return daysOfTheWeek[day];
}
我们可以这样打印:

printf("%s\n", dayOfTheWeek(SUNDAY));
for (Day day = MONDAY; day <= SUNDAY; ++day) {
    PrintDayOfTheWeek(day);
}
输出:

Day 1: Monday
Day 2: Tuesday
Day 3: Wednesday
Day 4: Thursday
Day 5: Friday
Day 6: Saturday
Day 7: Sunday
Sunday
这里也有一些很酷的东西。枚举最好用在switch语句中,很明显,这在技术上是可行的,如下所示:

printf("%s\n", dayOfTheWeek(SUNDAY));
for (Day day = MONDAY; day <= SUNDAY; ++day) {
    PrintDayOfTheWeek(day);
}

for(Day-Day=MONDAY;Day已经有了一些很好的答案,但是没有人实现了
const-char*array[]
。正如David C.Rankin在评论中所说:

创建一个全局指针数组,指向包含日期的字符串文本,例如const char*days[]={“星期一”、“星期二”…},然后只返回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]);
}
输出:

Day 1: Monday
Day 2: Tuesday
Day 3: Wednesday
Day 4: Thursday
Day 5: Friday
Day 6: Saturday
Day 7: Sunday
Sunday
现在,在您的问题中,您特别要求使用一个函数,该函数接受一个
enum
[value]并返回一个字符串指针。实现这一点与前面的示例非常类似。我们首先声明
enum DAYS

typedef enum DAYS {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
} Day;
const char* dayOfTheWeek(Day day) {
    return daysOfTheWeek[day];
}
方便的是,
enum
为它们的第一个值指定一个零(
0
)值,除非另有指定,因此此
enum
已与我们的
printDayOfWeek(int n)
函数一样工作

因此,例如,我们现在可以定义一个新函数,而不是直接用数字来调用它,该函数根据您的请求接收我们想要的日期。因此,只需传入
enum DAYS
中定义的周名称即可:

typedef enum DAYS {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
} Day;
const char* dayOfTheWeek(Day day) {
    return daysOfTheWeek[day];
}
我们可以这样打印:

printf("%s\n", dayOfTheWeek(SUNDAY));
for (Day day = MONDAY; day <= SUNDAY; ++day) {
    PrintDayOfTheWeek(day);
}
输出:

Day 1: Monday
Day 2: Tuesday
Day 3: Wednesday
Day 4: Thursday
Day 5: Friday
Day 6: Saturday
Day 7: Sunday
Sunday
这里也有一些很酷的东西。枚举最好用在switch语句中,显然,从技术上讲是可行的,比如:

printf("%s\n", dayOfTheWeek(SUNDAY));
for (Day day = MONDAY; day <= SUNDAY; ++day) {
    PrintDayOfTheWeek(day);
}

for(Day-Day=MONDAY;Day)的工作量比所需的工作量大。创建一个全局指针数组,以字符串文本形式保存日期,例如
const-char*days[]={“星期一”、“星期二”、…}