资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,语言程序设计,第十一章,字符串,C,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,11.1,字符串的存储形式,11.2,指针与字符串,11.3,字符串的输出,11.4,字符串的输入,11.5,字符串数组,11.6,对字符串的操作,第十一章 字符串,1,11.1.1,字符串常量,11.1.2,使用一维字符数组存放字符串,11.1.3,将,字符串赋给字符数组,11.1,字符串的存储形式,2,11.1.1,字符串常量,字符串常量,定义:以,双引号,括起来的,由若干个,字符,所组成的序列即为字符串常量。,存储形式:,在,C,中,一个字符用一个字节来存放。,字符串在内存中占的存储空间,=,字符串长度,+1,;末尾一位存放结尾符,0,。,说明:在,C,中没有字符串数据类型,却有,”,字符串常量”。,例 “,hello”,共,5,个字符,在内存占,6,个字节 字符串长度,5,,其存储形式为:,h,e,l,l,o,0,104,101,108,108,111,0,转义字符,,ASCII,码值为,0,空值,内存存放字符,ASCII,码,例,char ch5=,B,o,y,0;,ch0,B,o,y,0,0,用字符串常量,ch1,ch2,ch3,ch4,在,C,中,可通过一维字符数组处理字符串。每个字符数组的元素都是一个字符,当这些数组元素的最后一个字符是,0,时,我们就认为该字符数组保存的是一个字符串。,11.1.2,使用一维字符数组存放字符串,11.1.3,将字符串赋给字符数组,通过对单个元素赋值,方式:,在定义字符数组时对单个数组元素进行赋值。,在使用时对字符串进行赋值。,注意:,字符数组大小必须定义足够大,以便能够保存后面给出的字符串常量,同时也要考虑到字符串结尾符,0,也占用一个字节,因此,字符串长度必须小于字符数组的大小,在字符串的末尾必须赋空值,0,,用以表示字符串结束,若在字符数组中没有元素存放字符串结尾符,0,,则表示该字符数组保存的不是字符串。,当所赋初值少于所定义数组的元素个数时,将自动给后面的元素补以初值,0,例,char ch5=,B,o,y,0;,/,定义字符数组时对单个元素赋值,例,char ch5;,ch0=B;,ch1=o;,ch2=y;,ch3=0;,/,使用时对字符串进行赋值,没有,0,,不能作为字符串用,!,例,char ch5=,H,e,l,l,o,;,ch0,H,e,l,l,o,逐个字符赋值,ch1,ch2,ch3,ch4,例,char ch5=,B,o,y,0;,等价于:,char ch5=B,o,y;,比较:,char ch110=,H,e,l,l,o,;,char ch2=,H,e,l,l,o,0,;,char ch35=,H,e,l,l,o,;,h,e,l,l,o,0,h,e,l,l,o,h,e,l,l,o,0,0,0,0,0,字符串,非字符串,直接把字符串常量赋给字符数组,例,char ch,6,=,“Hello”,;,char ch6=“Hello”;,char,ch,=“Hello”;,用字符串常量,ch0,H,e,l,l,o,ch1,ch2,ch3,ch4,0,ch5,注意:,如果不是在定义时赋值,则须单个元素逐个赋值。,例:,char str10;,str=“Hello”,说明:,区分字符常量和字符串常量:,字符常量是用单引号引起来的单个字符,字符串常量是用双引号引起来的字符序列,当然,字符序列可以为空,也可以是一个字符。,例:,“”,表示空串,在内存中保存的是空字符,0,,占一个字节。,“,A”,表示含有一个大写字母的字符串,在内存中保存的是字母,A,和空字符,0,,占两个字节。,A,表示字母,A,,在内存中占一个字节。,“,ABCDEF”,表示含有个字母的字符串,在内存中占,7,个字节。,处理字符串常量的时候,字符串结束标志是编译系统,自动,添加的,不用人为的在字符串最后加上,0,。,字符数组的引用,:,【,例,】,从键盘输入一行字符,存放在字符数组中,然后,逆序输出。,main(),char a80,c;,int k=0,j;,printf(nplease,input the chars:);,scanf(%c,&c,);,while(c!=n),/*,输入字符序列输入字符为回车时结束*,/,ak+=c;,scanf(%c,&c,);,printf(n);,for(j=k-1;j=0;j-),/*,逆序输出字符序列*,/,printf(%c,aj,);,11.2,指针与字符串,在,C,中,可通过一维字符数组处理字符串,也可通过字符指针处理字符串。,用字符数组实现:,例,main(),char str=“I love China!”;,printf(“%sn”,str,);,printf(“%sn”,str+7,);,I,l,o,v,e,C,h,i,str0,str1,str2,str3,str4,str5,str6,str7,str8,str9,str,str10,str11,str12,str13,n,!,a,0,用字符指针实现,例,main(),char *str=“I love China!”;,printf(“%sn”,str,);,str+=7;,while(*str),putchar(str0);,str+;,I,l,o,v,e,C,h,i,str,n,!,a,0,字符指针,初始化,:把字符串,首地址,赋给,str,char *str;,str=“I love China!”;,str,*,str!=0,用字符指针实现,注意:,(,1,),str,是一个存放字符串起始地址的指针变量,不是一个字符串变量。,(,2,)在程序中出现字符串常量时,系统返回的是一个,起始地址,,因此可以将一个字符串常量赋值给一个字符指针变量。,例:,char str14;,str=“I love China”;,是错误的,!,在这里,,str,是一个字符数组,数组名,str,是一个指针常量,第二条语句相当于把字符串“,I love China”,的首地址赋给,str,,试图改变,str,的值,I,l,o,v,e,C,h,i,str,n,!,a,0,字符指针,初始化,:把字符串,首地址,赋给,str,char *str;,str=“I love China!”;,字符数组和字符指针处理字符串方式的区别:,字符数组,的每个元素存放字符串的每一个字符,末尾存放,0,。,字符指针,是指向为字符串开辟的内存空间,其值存放的是字符串的首地址。,数组,str,:,h,e,l,l,o,0,例:,char str=“hello”,*pstr=“spels”;,内存表示形式如下:,指针,str,:,h,e,l,l,o,0,11.3.1,使用,printf,函数输出字符串,11.3.2,使用,puts,函数输出字符串,11.3,字符串的输出,14,通过,C,语言系统提供的库函数,可以对整个字符串进行输出。,使用,printf,函数输出字符串,在,printf,的输出格式中,,%s,代表字符串,可以通过该格式输出字符串。,例,char str=“Hello,Spels!”;,printf(“%s”,str),输出结果:,Hello,Spels!,例,char str=“Hello,Spels!”;,printf(“%s”,str+6),输出结果:,Spels!,例,char str=“Hello0,Spels!”;,printf(“%s”,str+6),输出结果:,Hello,11.3.1,使用,printf,函数输出字符串,11.3.2,使用puts函数输出字符串,使用,puts,函数输出字符串,程序在使用,puts,来对字符串进行输出时,要在程序中包含头文件,stdio.h,。,puts,函数在输出完字符串后,会自动输出一个换行符,。,puts,函数的调用格式,:,puts(,字符串首地址,),;,例,char *pstr=“Hello,Spels!”;,puts(pstr),;,输出结果:,Hello,Spels!,例,char str=“Hello,Spels!”;,puts(str),;,11.4.1,输入字符串的必要条件,11.4.2,使用,scanf,函数输入字符串,11.4.3,使用,gets,函数输入字符串,11.4,字符串的输入,17,与字符串的输出类似,也可以通过库函数来对整个字符串进行输入。,输入字符串的必要条件,输入项可以是一个字符数组名,这样输入的字符串将存放到该数组中,此时数组应该足够大,以能保存输入的字符串。,输入项还可以是字符指针,这里的字符指针必须是已经指向确切的、足够大的存储空间,以便输入的字符串可以存放到该指针所指向的内存空间中。,11.4.1,输入字符串的必要条件,11.4.2,使用,scanf,函数输入字符串,使用,scanf,函数输入字符串,在,scanf,中,可以使用格式,%s,来输入一个字符串。,例:,char str20,;,scanf,(“%s”,str);,说明:,使用,scanf,通过,%s,格式进行输入时,输入的空格和回车都会被认为是数据的分隔符,而不作为数据被读入。,如果输入项是数组元素的地址时,输入数据将从这一地址开始存放。,11.4.3,使用,gets,函数输入字符串,使用,gets,函数输入字符串,程序在使用,puts,来对字符串进行输出时,要在程序中包含头文件,stdio.h,。,gets,函数的调用格式,:,gets(,待输入字符串首地址,),;,例,char str120;,getts(str1),;,执行上面语句,若从键盘输入:,Hi spels!,(此处,CR,代表,Enter,键,且,Hi,和,spels,!中间有空格,),则系统将读入,10,个字符,包括空格和回车符,依次存放在数组,str1,中,系统自动用,0,来取代最后的回车符。,字符串的输入输出,逐个字符,I/O,:,%c,整个字符串,I/O,:,%s,例 用,%c,main(),char str5;,int i;,for(i=0;i5;i+),scanf(“%c,”,&,stri,);,for(i=0;i5;i+),printf(“%c,”,stri,);,例 用,%s,main(),char str5;,scanf(“%s,”,str);,printf(“%s,”,str);,用字符数组名,不要加,&,输入串长度,数组维数,遇空格或回车结束,自动加,0,用字符数组名,遇,0,结束,应用举例,:,例,main(),char a5=H,e,l,l,o;,printf(“%s”,a,);,例,main(),char a=“Hello”;,printf(“%s”,a,);,结果:,Hello#-=*,h e l l o,0,2,3,1,4,结果:,Hello,用“,%s”,输出时,遇,0,结束,main(),char a=h,e,l,0,l,o,0;,printf(%s,a,);,例,输出:,hel,h e l 0 l o 0,数组中有多个,0,时,遇第一个结束,main(),int i;,char a5;,scanf(%s,a,);,for(i=0;i5;i+),printf(%d,ai,);,运行情况:,(,1,)若输入,hel,正常,(2)若输入,hell,正常,(3)若输入,hello,用%,s,输出时,,会出现问题,h e l 0,h e l l 0,h e l l o,输入字符串长度,数组维数,例 字符串输入举例,H o w 0,a r e 0,y o u?0,#include,main(),char a15,b5,c5;,scanf(%s%s%s,a,b,c,);,printf(a,=%,snb,=%,snc,=%sn,a,b,c);,scanf(%s,a,);,printf(a,=%sn,a);,运行情况:,输入:,How are you?,输出:,a=How,b=are,c=you?,输入:,How are you?,输出:,a=How,scanf,中%,s,输入时,遇空格或回车结束,运行情况:,输入:,How are you?,例 若准备将字符串“,This is a string.”,记录下来,,错误,的输入语句为:,(,A,),scanf(“%20s”,s);,(,B,),for(k=0;k17;k+),sk=,getchar,();,(,C,),while(c=,getchar,()!=n),sk+=c;,11.5.1,二维字符数组存放字符串数组,11.5.2,指针数组处理字符串数组,11.5,字符串数,组,27,11.5.1,二维字符数组存放字符串数组,字符串数组,即数组中的每一个元素存放的都是一个字符串,在,C,中,可以通过二维字符数组或一维指针数组来处理。,二维字符数组存放字符串数组,二维数组可以看作是一个一维数组,该数组中的每一个元素又是一个一维数组。如果这些一维数组中存放的都是字符串,那么这个二维数组保存的就是一个字符串数组。,如:,charstr520;,可以把这个二维数组看作是一个由,5,个字符串组成的一维数组,每个字符串的长度最大可以是,19,个字符。,例,char name420=“I”,”am”,”a”,”teacher”;,或,char name20=“I”,”am”,”a”,”teacher”;,二维数组,name,存放的就是一个字符串数组,,name0,、,name1,、,name2,、,name3,分别存放了,“,I”,”am”,”a”,”teacher”,四个字符串。可以调用,puts(namei,),来对以下字符串进行输出,其中,i,的取值应该是,03,之间。,11.5.2,指针数组处理字符串数组,指针数组处理字符串数组,可以定义一个一维字符指针数组,来处理字符串数组。若字符指针数组中的每一个元素都指向字符串,即可以认为该指针数组处理的是一个字符串数组。,例,char *pname4=“I”,”am”,”a”,”teacher”;,或,char pname=“I”,”am”,”a”,”teacher”;,pname,中的四个元素,pname0,、,pname1,、,pname2,、,pname3,分别指向,“,I”,”am”,”a”,”teacher”,四个字符串。,系统通过无名的一维字符数组来存储这些字符串,各字符串之间并不一定占用连续的存储单元。,一旦,pname,中的元素被重新赋值,如果没有其他字符指针指向相应的字符串,则相应的字符串将会丢失。,可以通过,pnamei,来引用上述字符串或者通过,pnameij,来引用该字符串中的字符。,11.6.1,字符串拷贝,11.6.2,求字符串长度,11.6.3,字符串链接,11.6.4,字符串比较,11.6,对字符串的操作,30,11.6.1,字符串拷贝,程序:,char *strcopy(char*d,char*s),char*p=d;,while(*s!=0),*p=*s;,p+;,s+;,*p=0;,return d;,字符串拷贝,例 编写函数,strcopy(char*d,char*s),,将指针,s,所指向的字符串复制到指针,d,所指向的存储空间中。,相应库函数:,C,语言系统为用户提供了库函数,strcpy,可以实现以上函数功能。,调用格式:,strcpy(d,s);,功能:,把,s,指向的字符串拷贝复制到,d,指向存储空间。,说明:,调用此函数时,程序必须包含,string.h,头文件,d,所指向的空间长度必须足够容纳,s,串,拷贝时0一同拷贝,不能使用赋值语句为一个字符数组赋值,例,char str120,str220;,str1=“Hello!”;(,),str2=str1;,(,),11.6.2 求字符串长度,程序:,int strcopy(char*str),inti=0;,while(stri!=0),i+;,return i;,求字符串长度,例 编写函数,strlength(char*str),,求字符串,str,的字符串长度。,相应库函数:,C,语言系统为用户提供了库函数,strlen,可以实现以上函数功能。,调用格式:,strlen(s);,功能:,此函数返回,s,指向的字符串的实际长度,,不包括0在内,。,说明:,调用此函数时,程序必须包含,string.h,头文件,可以把该函数的返回值赋给一个整型变量,如,len=strlen(s),例 对于以下字符串,,strlen(s,),的值为:,(1),char s10=A,0,B,C,0,D;,(,2,),char s=“tv0willn”;,(,3,),char s=“x69082n”;,11.6.3,字符串链接,程序:,char *strcatt(char*d,char*s),intlen;,len=strlen(d);,d+=len;,while(*s!=0),*d=*s;,d+;,s+;,*d=0;,return d;,字符串链接,例 编写函数,strcatt(char*d,char*s),,将,s,所指向的字符串复制到指针,d,所指向字符串后面。,该函数先求出,d,字符串的长度,然后把指针,d,移动到字符串,d,的末尾,最后通过,while,循环把,s,所指向的字符串的字符依次赋给,d,指向的字符串的后面,相应库函数:,C,语言系统为用户提供了库函数,strcat,可以实现以上函数功能。,调用格式:,strcat(d,s,);,功能:,把,s,指向的字符串复制到,d,指向的字符串的后面。,说明:,调用此函数时,程序必须包含,string.h,头文件,d,所指向的空间长度必须足够容纳,d,字符串以及,s,字符串,连接前,两串均以0结束;连接后,串1的0取消,新串最后加0,例,strcpy,与,strcat,举例,#include,#include,void main(),char str125;,char str2=,c=C+,str3=str3;,strcpy(str1,str3);,strcat(str1,str2);,strcat(str1,c);,printf(%sn,str1);,T,r,b,o,C,+,+,0,1,2,3,4,5,6,7,8,9,u,0,24,.,T,r,b,o,0,1,2,3,4,5,6,7,8,9,u,0,24,.,.,T,r,b,o,0,0,1,2,3,4,5,6,7,8,9,u,24,.,.,11.6.4,字符串比较,程序:,int strcompare(char*s1,char*s2),while(*s1=*s2&*s1),s1+;,s2+;,return(*s1-*s2);,字符串比较,例 编写函数,strcompare(char*s1,char*s2),,将两个字符串,s1,和,s2,进行比较,若,s1,大于,s2,,函数返回正值;若,s1,等于,s2,,函数返回,0,;若,s1,小于,s2,函数返回负值。,字符串比较,即把两个字符串相对应的字符拿出来进行比较,返回第一个不相等的字符比较出来的大小即可,相应库函数:,C,语言系统为用户提供了库函数,strcmp,可以实现以上函数功能。,调用格式:,strcmp(s1,s2);,功能:,比较两个字符串,比较规则:,对两串从左向右逐个字符比较(,ASCII,码),直到遇到不同字符或,0,为止,返值:,返回,int,型整数,,a.,若字符串,1,字符串,2,,返回正整数,c.,若字符串,1=,字符串,2,,返回零,说明:,调用此函数时,程序必须包含,string.h,头文件,字符串比较不能用“=”,必须用strcmp,#include,#include,main(),char str1=”Hello!,str2=”How are you?”,str20;,int len1,len2,len3;,len1=strlen(str1);len2=strlen(str2);,if(strcmp(str1,str2)0),strcpy(str,str1);strcat(str,str2);,else if(strcmp(str1,str2)0),strcpy(str,str2);strcat(str,str1);,else strcpy(str,str1);,len3=,strlen(str,);,puts(str);,printf(”Len1=%d,Len2=%d,Len3=%dn”,len1,len2,len3);,例,strcmp,与,strlen,举例,How are you?Hello!,Len1=6,Len2=12,Len3=18,
展开阅读全文