上节要点•掌握一维、二维数组的定义和引用方法、存储结构和初始化方法。•掌握有关一维数组的有关算法•掌握数组的运算。字符数组1、字符数组的定义定义方法与前面介绍的类似。例如:charc[10];c[0]=′I′;c[1]=′′;c[2]=′a′;c[3]=′m′;c[4]=′′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′;对字符数组初始化,可逐个字符赋给数组中各元素。例如:charc[10]={‘I’,’a’,’m’,’h’,’a’,’p’,’p’,’y’}2、字符数组的初始化如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符。charc[10]={′c′,′′,′p′,′r′,′o′,′g′,′r′,′a′,′m′};如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。charc[]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′};数组c的长度自动定为10。chardiamond[5][5]={{′′,′′,*′},{′′,′*′,′′,′*′},{′*′,′′,′′,′′,′*′},{′′,′*′,′′,′*′},{′′,′′,′*′}}定义和初始化一个二维字符数组3、字符数组的引用例输出一个字符串。程序如下:#includestdio.hvoidmain(){charc[10]={’I’,’’,’a’,’m’,’’,’a’,’’,’b’,’o’,′y′};inti;for(i=0;i10;i++)printf(″%c″,c[i]);printf(″\n″);}运行结果:Iamaboy例输出一个钻石图形#includestdio.hvoidmain(){chardiamond[][5]={{′′,′′,′*′},{′′,′*′,′′,′*′},{′*′,′′,′′,′′,′*′},{′′,′*′,′′,′*′},{′′,′′,′*′}};inti,j;for(i=0;i5;i++){for(j=0;j5;j++)printf(″%c″,diamond[i][j]);printf(″\n″);}}运行结果********4、字符串和字符串结束标志为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’。字符数组并不要求它的最后一个字符为′\0′,甚至可以不包含′\0′。例如:charc[5]={′C′,′h′,′i′,′n′,′a′};但是由于系统对字符串常量自动加一个′\0′。因此,为了使处理方法一致,在字符数组中也常人为地加上一个′\0′。例如:charc[6]={′C′,′h′,′i′,′n′,′a′,′\0′};字符数组的输入输出字符数组的输入输出可以有两种方法:•逐个字符输入输出。用格式符“%c”输入或输出一个字符。•将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。charc[]={″China″};printf(″%s″,c);例如在内存中数组c的状态说明:(1)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。(2)如果数组长度大于字符串实际长度,也只输出到遇′\0′结束。(3)输出字符不包括结束符′\0′。(4)如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束。(5)可以用scanf函数输入一个字符串。如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。例如:charstrl[5],str2[5],str3[5];scanf(″%s%s%s″,str1,str2,str3);输入数据:Howareyou?数组中未被赋值的元素的值自动置′\0′。分析图中所示的字符数组用8进制形式输出数组c的起始地址printf(″%o″,c);printf(″%s″,c);注意:scanf函数中的输入项如果字符数组名。不要再加地址符&,因为在C语言中数组名代表该数组的起始地址。下面写法不对:scanf(″%s″,&str);字符串处理函数1.puts函数其一般形式为:puts(字符数组)•其作用是将一个字符串(以′\0′结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为China。则执行puts(str);其结果是在终端上输出China。用puts函数输出的字符串中可以包含转义字符。例如:charstr[]={″China\nBeijing″};puts(str);输出结果:ChinaBeijing在输出时,将字符串结束标志′\0′转换成′\n′,即输出完字符串后换行。2.gets函数其一般形式为:gets(字符数组)其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:gets(str)从键盘输入:Computer↙将输入的字符串Computer送给字符数组str说明:函数值为字符数组str的起始地址。一般利用gets函数的目的是向字符数组输入一个字符串,而不大关心其函数值。注意:用puts和gets函数只能输入或输出一个字符串,不能写成puts(str1,str2)或gets(str1,str2)3.strcat函数其一般形式为:strcat(字符数组1,字符数组2)Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。例如:charstr1[30]={″People′sRepublicof″};charstr2[]={″China″};print(″%s″,strcat(str1,str2));输出:People′sRepublicofChina4.strcpy函数其一般形式为:strcpy(字符数组1,字符串2)strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:charstr1[10],str2[]={″China″};strcpy(str1,str2);关于strcpy函数的几点说明(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。(2)“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,″China″);(3)复制时连同字符串后面的′\0′一起复制到字符数组1中。(4)可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个‘\0’。(5)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如:str1=″China″;不合法str1=str2;不合法•用strcpy函数只能将一个字符串复制到另一个字符数组中去。•用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。下面是合法的使用:chara[5],c1,c2;c1=′A′;c2=′B′;a[0]=′C′;a[1]=′h′;a[2]=′i′;a[3]=′n′;a[4]=′a′;5.strcmp函数其一般形式为:strcmp(字符串1,字符串2)strcmp的作用是比较字符串1和字符串2。例如:strcmp(str1,str2);strcmp(″China″,″Korea″);strcmp(str1,″Beijing″);比较的结果由函数值带回(1)如果字符串1=字符串2,函数值为0。(2)如果字符串1字符串2,函数值为一正整数。(3)如果字符串1字符串2,函数值为一负整数。注意:对两个字符串比较,不能用以下形式:if(str1str2)printf(″yes″);而只能用if(strcmp(str1,str2)0)printf(″yes″);6.strlen函数其一般形式为:strlen(字符数组)strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括′\0′在内)。例如:charstr[10]={″China″};printf(″%d″,strlen(str));输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(″China″);7.strlwr函数其一般形式为:strlwr(字符串)strlwr函数的作用是将字符串中大写字母换成小写字母。8.strupr函数其一般形式为:strupr(字符串)strupr函数的作用是将字符串中小写字母换成大写字母。例、输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。字符数组应用举例作业:1、题目:打印出如下图案(菱形的一半)****************************2、有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。