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[]={“星期一”、“星期二”、…}