《字符串及其操作.ppt》由会员分享,可在线阅读,更多相关《字符串及其操作.ppt(32页珍藏版)》请在三一办公上搜索。
1、1,第十章字符串及其操作,内容提要,本章主要包括以下几个内容:概述字符与字符串 字符数组与字符串 字符串作为函数参数应用举例,10.1 引言,字符串是C语言中最有用而且最重要的数据结构之一。printf(“Welcome to C programming”);其中,传递给函数printf的参数就是一个字符串。双引号被用作字符串的边界符号,其中可以包含除了双引号之外的任何字母、数字以及特殊字符的任意组合。,用双引号括起来的字符序列,其长度可大于1。如:“How do you do”,“CHINA”,“a”,“$123.34”等可以使用#define来定义字符串常量一个字符变量只能存放一个字符。它
2、的定义形式如:char c1,c2;在内存中字符变量的存储形式是ASCII码注意区分和 前面章节中已经学习了字符常量、字符变量、字符串常量,到目前为止我们还没有使用过字符串变量 C语言中没有字符串变量,而是以字符数组来表示,10.2 字符与字符串,10.3 字符数组与字符串,字符数组与字符串的关系字符数组数据类型为 char 的数组char string80;字符串特殊的字符数组,字符数组的最后一个元素为0,字符串只是一种特殊的字符数组,一个新的名词或概念;不是一种新的数据类型。在C语言中 字符串有一套特殊的表示方法和处理方法。,字符数组的初始化:,1、用字符型数据逐个对数组进行初始化 cha
3、r str6=C,h,i,n,a,0;2、用字符串常量直接对数组初始化 char str6=China;char str6=China;,以0结尾的字符数组,用双引号括起表示字符串 常量,C语言自动为其添加0终结符在字符串初始化时,C语言允许采用”=”将一串字符一次赋给字符数组,10.3.1 字符数组的定义与初始化,用二维数组存放字符串char str 10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;,0行1行.6行,0列 1列.9列,对数组定义时,切记要给出足够长度,10.3.1 字符数组的定义与初始化,10.3.2 字
4、符串与指针,字符串在内存中的起始地址称为字符串的指针,可以定义一个字符指针变量指向一个字符串。在语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。1、逐个引用【exp10_1】#include main()char*string=”I love Beijing.”;for(;*string!=0;string+)printf(“%c”,*string);printf(“n”);,程序运行结果:I love Beijing.,程序说明:char*string=I love Beijing.;该语句定义并初始化字符指针变量string:用串常
5、量“I love Beijing.”的地址(由系统自动开辟、存储串常量的内存块的首地址)给string赋初值。该语句也可分成如下所示的两条语句:char*string;string=I love Beijing.;注意:字符指针变量string中,仅存储串常量的地址,而串常量的内容(即字符串本身),是存储在由系统自动开辟的内存块中,并在串尾添加一个结束标志0。,10.3.2 字符串与指针,2.整体引用采取整体引用的办法,改写上例。【exp10_2】#include main()char*string=”I love Beijing.”;printf(“%sn”,string);程序说明:pri
6、ntf(“%sn”,string);语句通过指向字符串的指针变量string,整体引用它所指向的字符串的原理:系统首先输出string指向的第一个字符,然后使string自动加,使之指向下一个字符;重复上述过程,直至遇到字符串结束标志。,10.3.2 字符串与指针,注意:其它类型的数组,是不能用数组名来一次性输出它的全部元素的,只能逐个元素输出。例如:int array10=;.printf(%dn,array);/*这种用法非法*/.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者是有区别的,不能混为一谈。,10.3.2 字符串与指针,字符指针变量与
7、字符数组的主要区别:(1)存储内容不同:字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。(2)赋值方式不同:对字符指针变量,可采用下面的赋值语句赋值:char*pointer;pointer=This is a example.;而字符数组,虽然可以在定义时初始化,但不能用赋值语句整体赋值。下面的用法是非法的:char char_array20;char_array=This is a example.;/*非法用法*/(3)指针变量的值是可以改变的,字符指针变量也不例外;而数组名代表数组的起始地址,是一个常量,而常量是不能被改变的。,10.
8、3.2 字符串与指针,10.3.2 字符串与指针,字符字符数组与指针变量的用法总结,字符串数组(指针数组)例如char*country3=“China”,“England”,“USA”;第一个指针country0指向“China”第二个指针country1指向“England”第三个指针country2指向“USA”注意:对比二维数组char str 10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;,1、逐个输入输出字符数组for(i=0;Stri10;i+)getchar(Stri);putchar(Stri);,声明
9、char Str10;用于存储字符,最多10个用于存储字符串,最多9个,10.3.3 字符串的输入输出,为什么?,字符串for(i=0;Stri9;i+)scanf(%c,2、一次性输入输出scanf(%s,Str);printf(%s,Str);gets(s);puts(s);,注意:字符串含有空格、回车或Tab符号,不能用scanf(“%s”,)读入,而 gets()可以。printf(“%s”,)遇到字符数组中0 停止输出。比较scanf与gets的使用(见P141的例10-8),10.3.3 字符串的输入输出,10.3.4 常用的字符串处理函数,字符串的处理一般借助字符串处理函数。在中
10、定义了若干专门的字符串处理函数,如:strcpy:string copystrcmp:string comparisonstrcat:string combinationstrlen:string length使用前需要加上#include,10.3.4 常用的字符串处理函数,strcpy:string copy用法:strcpy(字符数组,字符串2)原型:char*strcpy(char*dest,const char*src);用途:将字符串2拷贝到字符数组中,相当于赋值语句。例如:char str110;str2=“China”strcpy(str1,str2);字符数组1必须是写成数组
11、名,字符数组2 可以是数组名也可以是一个字符串。又如:strcpy(str1,“china”);,10.3.4 常用的字符串处理函数,不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。但可以给一个字符变量或字符数组元素赋值。如下面的赋值是不合法的。char str1=“China”,str220;str2=str1;()下面的赋值是合法的。char a5,c1,c2;c1=A;c2=B;a0=C;a1=h,a2=i;a3=n;a4=a,7.4 字符数组,strcmp:string comparison 用法:strcmp(字符串1,字符串2)原型:int strcmp(const
12、char*s1,const char*s2);用途:当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小 比较两个字符串的大小。ASCII值大的为大。零,两个串相等 返回值:正数 str1str2 负数 str1str2 注意:两个字符串不能用关系运算符比较,如下面的写法是不合法的:if(str1=str2)printf(”yes”);应写成 if(strcmp(str1,str2)=0)printf(“yes”);,10.3.4 常用的字符串处理函数,strcat:string catenate 用法:strcat(字符串1,字符串2)原型:char*strcat(char*des
13、t,const char*src);用途:把两个字符串连接在一起,组成一个字符串;字符数组2中的字符串连接到字符数组1中的字符串后面,并删去原字符数组1后面的“0”,最后将结果存在字符数组1中。例如:char str1=“Ch”;str2=“ina”;strcat(str1,str2);结果:str1成了“China”,而str2不变。,10.3.4 常用的字符串处理函数,strlen:string length用法:strlen(字符数组(或字符串)原型:size_t strlen(const char*s);用途:测试字符串的实际长度,其中不包括0。例如:char str1=“China”
14、;printf(“%d”,strlen(str1);结果:输出5,可以采用多种形式,如:实参和形参均为数组,均为指针等。但其本质都是一样的。参考前面章节中所掌握的关于指针的知识,可以加深理解。与数组名作函数参数一样,字符串作为函数参数时,不是单向值传递,而是把实参数组的起始地址传递给形参数组,这样两个数组共占同一段内存单元,形参的改变会导致实参的改变,这种传递方式叫“地址传送”。,10.4 字符串作为函数参数,用函数调用方式,实现字符串的复制。【exp10_4】void string_copy(char*str_from,char*str_to)int i=0;for(;(*(str_to+i
15、)=*(str_from+i)!=0;i+);void main()char array_str120=”I am a teacher.”;char array_str220;string_copy(array_str1,array_str2);/*数组名作实参*/printf(“array_str2=%sn”,array_str2);,10.4 字符串作为函数参数,程序说明for(;(*(str_to+i)=*(str_from+i)!=0;i+);语句的执行过程为:首先将源串中的当前字符,复制到目标串中;然后判断该字符(即赋值表达式的值)是否是结束标志。如果不是,则相对位置变量i的值增1,
16、以便复制下一个字符;如果是结束标志,则结束循环。其特点是:先复制、后判断,循环结束前,结束标志已经复制。在C语言中,用赋值运算符、而不是单独的赋值语句来实现赋值操作,能给某些处理带来很大的灵活性,该语句(实现字符串的复制)的用法就是最好的例证。,10.4.2 字符串指针作函数参数,10.5 程序举例,使用字符数组来解决猜谜问题【exp10_5】#include#define ANSWER Grantvoid main()char try40;puts(Who is buried in Grants tomb?);gets(try);while(try!=ANSWER)/进行判断 puts(No
17、,thats wrong.Try again.);gets(try);puts(Thats right!);,该程序的问题在那里?,Who is buried in Grants tomb?TomNo,thats wrong.Try again.GrantNo,thats wrong.Try again.,10.5 程序举例,正确的程序:【exp10_5_1】#include#define ANSWER Grantvoid main()char try40;puts(Who is buried in Grants tomb?);gets(try);while(strcmp(try,ANSWER
18、)!=0)/判断的正确方法 puts(No,thats wrong.Try again.);gets(try);puts(Thats right!);,10.5 程序举例,从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名 等价于求最小字符串【exp10_6】,#include#include#define ARRA_SIZE 80main()int n,num;char strARRA_SIZE,minARRA_SIZE;printf(Please enter five names:n);gets(str);strcpy(min,str);for(n=1;n5;n+)
19、gets(str);if(strcmp(str,min)0)strcpy(min,str);printf(The min is:);puts(min);,本章小结,本章主要介绍了一种特殊的数组字符串的用法。和一般的数组不同,字符串具有不同的特点。1)关于定义和初始化字符串方法有:使用字符串常量:#define FUN Hello!使用字符数组:static char fun10=Hello!;使用字符指针:static char*fun=Hello!;使用字符串数组:static char*fruit3=Apple,pear,orange;,本章小结,2)使用输入/输出函数。输入函数主要有:scanf(),gets();请注意其中的区别。输出函数主要有:printf();puts();3)常用的字符串处理函数。主要包括:strlen();strcat();strcmp();strcpy();。4)注意空串和 之间的不同之处。5)注意char*str 和 char str 两种定义方式的异同。,作业,1、课后习题10.6 2、不使用strcat函数,编程将字符数组str1,str2连成一个新的字符数组str3。,
链接地址:https://www.31ppt.com/p-6268056.html