字符数组与字符串.ppt
1,上讲回顾,数组的概念数组的定义数组的初始化数组元素的引用,2,一、字符数组,1.字符数组的定义,定义方法与前面介绍的数值型数组的定义类似。例如:char c10;,2.字符数组的初始化,初始化的方法与前面介绍的数值型数组的初始化类似。例如:char c10=I,a,m,h,a,p,p,y/可逐个字符赋给数组中各元素,不足的地方自动定为空字符,3,3.字符数组的引用,例7.6 输出一个字符串。,程序如下:#include void main()char c10=I,a,m,a,b,o,y;int i;for(i=0;i10;i+)printf(%c,ci);printf(n);,运行结果:I am a boy,4,4.字符串和字符串结束标志,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”0。,字符数组并不要求它的最后一个字符为0,甚至可以不包含0。0 由系统自动添加。例如:char c5=C,h,i,n,a;,在C中,字符串是通过字符数组来存储的,5,5.字符串(字符数组)的输入输出,字符数组的输入输出可以有两种方法:逐个字符输入输出。用格式符“%c”输入或输出一个字符。将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。,char c=China;printf(%s,c);,例如,6,说明数组名表示数组的首地址;用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。如果数组长度大于字符串实际长度,也只输出到遇0结束。输出字符不包括结束符0。、如果一个字符数组中包含一个以上0,则遇第一个0时输出就结束。,7,puts函数 字符串的输出其一般形式为:puts(字符数组)其作用是将一个字符串(以0结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为China。则执行puts(str);其结果是在终端上输出China。,6.字符串处理函数,字符数组名(代表字符串的首地址),8,gets函数 字符串的输入其一般形式为:gets(字符数组)其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:gets(str)从键盘输入:Computer将输入的字符串Computer送给字符数组str,字符数组名(代表字符串的首地址),9,注意 用puts和gets函数只能输入或输出一个字符串,不能写成puts(str1,str2)或 gets(str1,str2),10,/例:gets,puts#includevoid main()char str30;/定义一字符数组gets(str);/得到一字符串puts(str);/输出字符串,11,strcat函数 字符串的连接其一般形式为:strcat(字符数组1,字符数组2)strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。,12,/例:strcat#includevoid main()char str130,str220;puts(please intput the string1:);gets(str1);puts(please intput the string2:);gets(str2);strcat(str1,str2);puts(The final string is:);puts(str1);,13,strcpy函数 字符串的复制其一般形式为:strcpy(字符数组1,字符串2)strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:char str110,str2=China;strcpy(str1,str2);,14,关于strcpy函数的几点说明,字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。,“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,China);,复制时连同字符串后面的0一起复制到字符数组1中。,可以用strncpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strncpy(str1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个0。,15,例:/strcpy#includevoid main()char str130,str220;puts(please intput the string:);gets(str2);/得到字符串str2strcpy(str1,str2);/将str2复制到str1中puts(The string1 is:);puts(str1);/输出str1,16,/strncpy#includevoid main()char str130,str220;puts(please intput the string1:);gets(str1);puts(please intput the string2:);gets(str2);strncpy(str1,str2,3);/将str2的前3个字符替代str1的前三个字符puts(The string1 is:);puts(str1);,17,strcmp函数 其一般形式为:strcmp(字符串1,字符串2)strcmp的作用是比较字符串1和字符串2。例如:strcmp(str1,str2);strcmp(China,Korea);strcmp(str1,Beijing);,18,比较的结果由函数值带回(1)如果字符串1=字符串2,函数值为0。(2)如果字符串1字符串2,函数值为一正整数。(3)如果字符串1str2)printf(yes);而只能用if(strcmp(str1,str2)0)printf(yes);,19,strlen函数 其一般形式为:strlen(字符数组)strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括0在内)。例如:char str10=China;printf(%d,strlen(str);输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(China);,20,strlwr函数 其一般形式为:strlwr(字符串)strlwr函数的作用是将字符串中大写字母换成小写字母。,strupr函数 其一般形式为:strupr(字符串)strupr函数的作用是将字符串中小写字母换成大写字母。,21,说明,使用字符串处理函数需加入字符串头文件,如#include,在C+的编译环境中可以省略。,22,例:字符串的连接另解 p154 7.13,/解法2:不利用相关操作函数#includevoid main()char s130,s230;int t,i,j;puts(please input the str1:);/printf(please input the str1:n);gets(s1);puts(please input the str2:);gets(s2);t=strlen(s1);for(i=0;istrlen(s2);i+)s1t+i=s2i;s1t+i=0;/给连接后的字符串s1一个结束的标志puts(s1);,/解法1:利用strcat函数#includevoid main()char str130,str220;puts(please intput the string1:);gets(str1);puts(please intput the string2:);gets(str2);strcat(str1,str2);puts(The final string is:);puts(str1);,23,/解法3:字符串的连接#includevoid main()char s130,s230;int t,i,j;puts(please input the str1:);/printf(please input the str1:n);gets(s1);puts(please input the str2:);gets(s2);t=strlen(s1);for(i=0;s2i!=0;i+)s1t+i=s2i;s1t+i=0;/给连接后的字符串s1一个结束的标志puts(s1);,24,解法4:字符串的连接#includevoid main()char s130,s230;int t,i,j;puts(please input the str1:);/printf(please input the str1:n);gets(s1);puts(please input the str2:);gets(s2);t=strlen(s1);i=0;while(s2i!=0)/当s2串没有访问完的时候s1t+=s2i+;s1t=0;/给连接后的字符串s1一个结束的标志puts(s1);,此语句相当于:s1t=s2i;t+;i+;,25,例:字符串反序输出;,/解法1#includevoid main()char s130,s230;int t,i;puts(please input the str1:);gets(s1);t=strlen(s1);i=0;while(s1i!=0)s2t-1-i=s1i;/第一个字符串从头开始依次赋值给第二个字符串(从后向前)i+;s2t=0;puts(s2);,26,/解法2:思路同解法1#includevoid main()char s130,s230;int t,i;puts(please input the str1:);gets(s1);for(t=strlen(s1),i=0;it;i+)s2t-1-i=s1i;s2t=0;/s1,s2等长度,补充结束标志puts(s2);,这两种解法都是利用了一个字符数组来存储逆序的字符串,同前面讲的变量的交换一样,都借助了辅助的存储空间,27,/解法3:字符串的逆序#includevoid main()char s130,s230,temp;int t,i;puts(please input the str1:);gets(s1);t=strlen(s1);i=0;while(it/2)temp=s1t-1-i;s1t-1-i=s1i;s1i=temp;i+;/第一个字符和最后一个交换,第二个和倒数第二个交换,依此类推puts(the conversed string is:);puts(s1);,28,作业,结合教材,认真复习、掌握此两讲课件内容;预习P134 例7.3,P139 例7.5预习P177 8.7节(勿必),29,/7.3,上讲作业#includevoid main()int a33,i,j,sum=0;for(i=0;i3;i+)for(j=0;j3;j+)scanf(%d,30,/7.5#includevoid main()int a10,i,temp;for(i=0;i10;i+)scanf(%d,31,#includevoid main()int i,j,a1010;for(i=0;i10;i+)/初始化每行第一个元素 ai0=1;for(i=0;i10;i+)for(j=0;j=i;j+)if(i=j)aij=1;/初始化对角线元素for(i=2;i10;i+)for(j=1;j=i-1;j+)aij=ai-1j+ai-1j-1;/给其他元素赋值 for(i=0;i10;i+)for(j=0;j=i;j+)printf(%d,aij);printf(“n”);/输出杨辉三角,/P153 7.6参考源程序,