编写一程序,输出该月的英文月名

题目是:编写一程序,输入月份号,输出该月的英文月名。例如,输入“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ᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在你的代码中,有两个问题导致了输出错误:

  1. search() 函数中,你定义了一个字符串数组 s,用于存储月份名。但是,你将数组的第一个元素设为了 "yue",这会导致数组下标从 1 开始,而不是从 0 开始。因此,当你传入月份 1 时,虽然输出正确,但是当你传入月份 2 时,就会输出 "yue",因为此时 s[2] 指向的是一个没有存储数据的位置。

  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] 指向的字符串拷贝到了动态分配的内存空间中。最后,在程序结束之前需要释放动态分配的内存空间,以避免内存泄漏。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7552969
  • 你也可以参考下这篇文章:8.18编一程序,输入月份号,输出该月的英文月名。例如,输入'3',则输出'March',要求用指针数组处理。
  • 除此之外, 这篇博客: C语言指针练习中的 4、编写一程序,输入月份号,输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组处理。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #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;
    }