月份查询(指针数组)

差点整懵了

Posted by 婷 on October 19, 2019 本文总阅读量

登了我们学校计软的一个在线编程网站,挑了一道指针数组的题来做

题目描述

已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词

1月 January 2月 February 3月 March 4月 April 5月 May 6月 June 7月 July

8月 Aguest 9月 September 10月 October 11月 November 12月 December

输入

第一行输入t表示t个测试实例

接着每行输入一个月份的数字

依次输入t行

输出

每行输出相应的月份的字符串,若没有这个月份的单词,输出error

样例输入

3 5 11 15

样例输出

May November error

字符指针的输出


一开始我的思路是定义一个char 类型的指针数组,每个元素都指向一个表示月份的字符串,然后我去判断程序输入的月份去数组里面选择对应的元素下标并输出。

char *month[]={"January","February","March","April","May","June","July","Aguest","September","October","November","December"};

结果在执行输出语句的时候,发现*month[0]输出的是J,我以为它会输出整个January整个字符串。同理接下来输出的都是FMA

printf("%c",*month[0]);
printf("%c",*month[1]);
printf("%c",*month[2]);
printf("%c",*month[3]);

最最最迷惑的是当我执行下面这个语句的时候,我以为他是跟上面第一句的效果一样的,结果输出框里面什么都没输出。

printf("%c",*month);

2.png

上网搜索一波,发现了一个类似的例子,but,感觉结果不是太像。。。

#include <stdio.h>

char *aa="this is a test";

void main(void)
{
 	printf("%c\n",*(aa));
    printf("%c\n",*(aa+1));
    printf("%c\n",*(aa+2));
    printf("%c\n",*(aa+3));	
}

1.png

当我将程序修改了一下之后,发现报错了。

#include <stdio.h>

char *aa="this is a test";

void main(void)
{
   printf("%c\n",*(aa[0]));
}

是个非常简单的错误。。。(可能是沉浸于上一道题没走出来),aa是一个指针,然后取指针指向的地址的内容有两种方法,一种是用*运算符,一种是用[]。所以我如果使用*的话,那么*的内容应该是一个地址,然而这里确实aa[0]是一个数,而不是地址,所以报错了。

那回到上面那个问题

printf("%c",*month[0]);

我定义的是一个指针数组,里面的元素都是一个指针,所以month[0]就是一个指针,指向一个字符,然后用*符号所以就是直接输出这个元素所指向的字符。既然是指向一个字符了,那肯定是输出字符串的第一个字符。

printf("%c",*month);

至于这个为什么没有输出,因为*month是一个指针,应该用printf("%p",*month)才对。

所以上面的疑惑解开了。

那如果我要输出一月份整个单词怎么做呢,很简单,既然你month[0]是一个指向字符串January的第一个字符,那么你移动指针不就ok喽。

#include <stdio.h>

char *month[]={"January","February","March","April","May","June","July","Aguest","September","October","November","December"};

int i; 

void main(void)
{
   	for(i=0;*(month[0]+i)!='\0';i++)//输出一月的单词
	{
		printf("%c",*(month[0]+i));
	}
    for(i=0;*(month[4]+i)!='\0';i++)//输出五月的单词
	{
		printf("%c",*(month[4]+i));
	}
	for(i=0;*(month[5]+i)!='\0';i++)//输出六月的单词
	{
		printf("%c",*(month[5]+i));
	}
}

好的这个小问题算是弄清楚了。

创建一个动态的一维数组


malloc来分配一段内存,最后用free释放掉。这两个函数所在的头文件:#include <stdlib.h>。如下所示我创建的是一个含有五个元素的一维数组。

int *get = NULL;         
get = (int*)malloc((5) *sizeof(int));

如果是定义一个指针数组的话

int **get = NULL;         
get = (int**)malloc(sizeof(int*)*5);

如果是C++的话就直接用new就好了

int *get=new  int[5];

题目解法


最后附上自己跑的通的代码

#include <stdio.h>
#include <stdlib.h>

char *month[]={"January","February","March","April","May","June","July","Aguest","September","October","November","December"};
int num,j,k; 

void main(void)
{
	scanf("%d",&num);

    int *get = NULL;
   	
   	get=(int*)malloc((num) *sizeof(int));
   	 	
    for(j=0;j<num;j++)
	{
		scanf("%d",&get[j]);
	}
 
    for(j=0;j<num;j++)
    {
   	  if(get[j] <=12 && get[j] >=1)
   	  {
   	  	  for(k=0;*(month[get[j]-1]+k) != '\0';k++)
	   	  {
	   	  	printf("%c",*(month[get[j]-1]+k));
		  }
		  printf("\n");	
	  }
	  else
	  {
	  	printf("error\n");	
	  }	 
   }
}