求高手解答,关于返回指针的函数,该怎么处理

求高手解答,关于返回指针的函数
#include <STDIO.H>
#include <STDLIB.H>


char *cmonth(int month)
{
char str_month[]={
"Illegal Month"
"January"
"February"
"March"
"April"
"May"
"June"
"July"
"August"
"September"
"October"
"November"
"December"
};
char *p;


if (month>=1 && month<=12)
{
p=&str_month[month];

else
{
p=&str_month[0];
}


return p;
}


int main()
{
int i;


printf("输入月份数字:");
scanf("%d",&i);
printf("\n");
printf("月份%d-->英文名称:%s\n",i,cmonth(i));
return 0;
}

目的是获取月份的英文表示,按课本上的代码敲得,但是有错误,我改过来以后,结果不对,求高手解答
------解决方案--------------------
char *cmonth(int month)函数不对,你的char str_month[]相当于定义了子一个字符串“Illegal MonthJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember”。你再想一下,比如输入月份1,你怎么提取出中间的January来显示?显然很难。
所以你要用二维的数组来存月份字符串。
------解决方案--------------------
把cmonth函数改成如下这样即可:


char * cmonth(int month)
{
char *str_month[] = {
"Illegal Month",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
return (month >= 1 && month <= 12) ?  str_month[month] : str_month[0];
}

------解决方案--------------------
其实返回引用不错,而且相较不容易出错。
------解决方案--------------------
 char *str_month[] = {
        "Illegal Month",
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"
    };
char * cmonth(int month)
{  
    return (month >= 1 && month <= 12) ?  str_month[month] : str_month[0];
}

------解决方案--------------------
函不函数不谈。有个问题你得搞明白;
char类型的变量存储一个字符 'a'
char*类型的变量存储一个字符串 "aaaaaaa"

你定义了char[]类型的变量 str_month,给它赋值就该是"aaaaaa",或者{'a','a',...,'a'};
而不是{"aaa","bbb"...,"zzz"}
要存储{"aaa","bbb"...,"zzz"}就得定义char*[]类型的变量


char* getMonth(int iMonth)
{
char* months[] = {"illegal",
"m1","m2","m3","m4","m5","m6",
"m7","m8","m9","m10","m11","m12"
};

return iMonth>=0&&iMonth<=13 ? months[iMonth]:months[0];
}
------解决方案--------------------
char *cmonth(int month)
{
char* str_month[]={
"Illegal Month",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
char *p;


if (month>=1 && month<=12)
{
p = str_month[month];

else
{
p=str_month[0];
}


return p;
}

------解决方案--------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!