题目是:编写一程序,输入月份号,输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组处理。我的代码只能正确输出第一个月。后面就输出不了了(或者有乱码),什么问题?
#include <stdio.h>
void search(char **p,int month);
int main()
{printf("请输入月份:");
int n;
char *p=NULL;
scanf("%d",&n);
search(&p,n);
printf("%s",p);
return 0;
}
void search(char **p,int month)
{char s[13][10]={"yue","January","February","March","April","May","June","July","August","September","October","November","December"};
*p=s[month];
}
把月名称数组定义为全局变量即可。原代码里定义在search()函数里为局部变量,生命周期随函数运行结束,数组s[][]的空间会被释放,通过指针p 传回的地址也随之失效。修改如下,供参考:
#include <stdio.h>
char s[13][10]={"yue","January","February","March","April","May", //将数组 s[13][10]定义为全局变量
"June","July","August","September","October","November","December"};
void search(char **p,int month);
int main()
{
printf("请输入月份:");
int n;
char *p=NULL;
scanf("%d",&n);
search(&p,n);
printf("%s",p);
return 0;
}
void search(char **p,int month)
{
if (month > 0 && month <= 12)
*p = s[month];
}
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在你的代码中,有两个问题导致了输出错误:
在 search()
函数中,你定义了一个字符串数组 s
,用于存储月份名。但是,你将数组的第一个元素设为了 "yue",这会导致数组下标从 1 开始,而不是从 0 开始。因此,当你传入月份 1 时,虽然输出正确,但是当你传入月份 2 时,就会输出 "yue",因为此时 s[2]
指向的是一个没有存储数据的位置。
在 search()
函数中,你将字符串数组 s
中指向月份名的指针赋值给了指针变量 *p
,这个指针变量实际上是 main()
函数中定义的指针变量 p
的地址。因此,当 search()
函数执行完毕后,main()
函数中的指针变量 p
指向了 s[month]
所指向的字符串。但是 s
数组是在 search()
函数中定义的局部变量,当 search()
函数执行完毕后,它的内存空间就被释放了,main()
函数中的指针变量 p
就成了一个野指针,指向了一个已经被释放的内存地址。这会导致输出出现乱码或者程序崩溃。
为了解决这些问题,你可以将 s
数组中的第一个元素改为一个空字符串,这样数组下标就从 0 开始。另外,你需要将 search()
函数中的指针变量 *p
指向动态分配的内存空间,以避免出现野指针的问题。修改后的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void search(char **p, int month);
int main()
{
printf("请输入月份:");
int n;
char *p = NULL;
scanf("%d", &n);
search(&p, n);
printf("%s", p);
free(p);
return 0;
}
void search(char **p, int month)
{
char s[13][10] = {"", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
*p = (char *) malloc(strlen(s[month]) + 1);
strcpy(*p, s[month]);
}
在这个修改后的代码中,首先将 s
数组中的第一个元素改为了一个空字符串。在 search()
函数中,使用 malloc()
动态分配了内存空间,并将指向该空间的指针赋值给了指针变量 *p
。然后使用 strcpy()
函数将 s[month]
指向的字符串拷贝到了动态分配的内存空间中。最后,在程序结束之前需要释放动态分配的内存空间,以避免内存泄漏。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
#include <stdio.h>
#include <stdlib.h>
/* 编写一程序,输入月份号,输出该月的英文月名。例如,输入"3",则输出"March",要求用指针数组处理。 */
int main() {
int month;
char *Month[12] = { "January","February","March","April","May","June","July","August","September","October","November","December" };
printf("请输入月份:");
scanf("%d", &month);
for (;month < 1 || month>12; printf("您的输入有误,请重新输入\n"), scanf("%d", &month));
printf("%d月的英文名为:%s\n", month, *(Month + month - 1));
return 0;
}