第七课

前言

由于暑假将尽,并察觉上课同学学习力较强(or已有基础),现决定加快进度,增加每节课的知识点浓度。

复习

字符、字符串

要想要了解字符数组,我们就要先了解 字符字符串 的区别

那么,什么是字符,什么是字符串呢?

字符,就是单个单个的字,也可以是单个的标点符号

同时,单个的数字也可以是一个字符(作为字符的数字一般不用于做计算)

字符最大的特点就是 单个

字符串,就是许多字符组合起来的一串

并且字符串一定带有 结束符号 '\0'

大家可以这样理解

  • 字符 单个的山楂
  • 字符串 串成糖葫芦的一串山楂(结束符号等于那根串起来的竹签)

在 C语言 中,我们通过单双引号来区分字符和字符串

被单引号''包围起来的就是字符

'a''b''c''d'    //四个字符

被双引号""包围起来的就是字符串

"abcd"          //字符串
//实则等于
'a''b''c''d''\0'

以上,就是 字符字符串 的区别

字符数组

字符数组,顾名思义是用于存放字符的数组

为什么我会把这个数组单独拿出来讲,而不是和前面其他数组一起讲呢

因为这个数组有它的不同之处

其他类型的数组定义了多少个空间,就可以存放多少个数据

比如:

int array1[5];
float array2[5];

这些数组都拥有下标为 0 – 4 的 5 个空间

这两个数组分别定义了 5 个空间,它们就各能存放 5 个各数据

而字符数组不同之处主要在于涉及到了字符串

而我们刚刚说过,对于字符串来说

它需要最后一个空间来存放 结束符号 '\0'

也就是说,如果你定义了一个 5 个空间的字符型数组

用于存放字符串的话

你只有4个可用的空间来存放字符(因为最后要留一个空间给'\0'

如果不留这个空间呢?

其实也可以正常运行,不过在使用一些操作字符串的函数时非常容易出错,并且这种bug不容易找

比如puts()函数等。

字符型数组的定义方法与其他数组相同,例:

char a[5];

而初始化的方法有以下几种

第一种、直接给各个空间放入字符

char a[5] = {'a','1','#',' ','\0'};
// 分别为  小写英文字符  数字字符  符号字符  空格(符号)  结束符

第二种、直接赋值字符串

char a[5] = "a1# ";
char a[]  = "a1# "; //这种赋值方法可以不填所需空间大小,会自动计算并以结束符结尾(其他不行

第三种、操作单个字符数组空间

char a[5];
a[0] = 'a';
a[1] = '1';
a[2] = '#';
a[3] = ' ';
a[4] = '\0';

第一种,和其他数组相同,只不过请注意

因为你存放的是 “字符” 所以要记得添加单引号 ''

第三种同样,只需要注意单引号就行

而第二种方法,你在初始化的时候是可以不输入空间大小的

它能够自动计算大小,并且在最后自动添加结束符

这种方法,我们在前面储存人名的时候就用过

二维字符数组

二维数组的定义方法我就不多说了

char map[50][50];

主要要讲一下的是初始化方法

一般我们可以这么初始化

char a[50][50]={"##############################",
                "#0         #   ##     ### ####",
                "# ###### # # #    # ##########",
                "# #   ## #   # #### # ### ####",
                "#   # ##  ###    #  #  ## ####",
                "##### #     # ##### ##    ####",
                "#   # ##### #   #   # # #   ##",
                "# # #    ## # #### ## # # ####",
                "# # # ###     ##      # # ####",
                "# # # ####### ## ###### #   ##",
                "# #   ##   # ## ###### ###   #",
                "# ###### # #####  #        # #",
                "#        # #     ##### ### #  ",
                "# ######## ##### # ### ### # #",
                "#     # ## ##### ###       ###",
                "##### # ## #      ######## # #",
                "#     # ## ## ###        #   #",
                "# # ###       ###### ####### #",
                "# #    ### ##      #         #",
                "##############################"};

当然,也可以嵌套循环使用scanf来输入

char map[50][50];
int i, j;
for(i=0;i<50;i++)
  for(j=0;j<50;j++)
  {
    scanf("%c",&map[i][j]);
  }

免回车读取一个字符

平时输入我们可以输入完一个字符敲击一次回车

可是当我们要做游戏的时候就不能这样子了

输入一个字符敲一次回车这怎么玩对吧

所以我们就需要一个函数,能够免去回车读取字符

目前我所知道的有两个

getche();   //带回显
getch();    //不带回显

我们先来说说getche();

这个函数的作用是读取一个字符输入(不需回车),并且直接重新输出

接着是getch();

这个函数才是我们需要的,直接读取,并且不带回显

下面这小段代码能显示getch()的特性

char a;
a = getch();

大家可以看到,并没有回显

不过,我们加上printf("%c",a); 就能看到其实是已经成功读取进去了

好,今天就到这里

下节课,我来给大家解决小人在迷宫里走路的坐标问题~


发表评论

电子邮件地址不会被公开。 必填项已用*标注