《C语言程序设计课件第9章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件第9章.ppt(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、高级语言程序设计 2023/1/1612023/1/162第九章 字符串主讲主讲:计算机学院计算机学院 朱立华朱立华内容提要内容提要n本章介绍字符串的存储与处理的相关知识本章介绍字符串的存储与处理的相关知识,掌握以下内掌握以下内容:容:字符串常量在内存中的存储方式字符串常量在内存中的存储方式,所占字节数所占字节数字符串如何利用字符数组和字符指针进行赋值、输入和输出字符串如何利用字符数组和字符指针进行赋值、输入和输出专门用于处理字符串的专门用于处理字符串的几个常用函数的原型及实现几个常用函数的原型及实现n字符串的应用很广泛,掌握以下两种应用并能举一反三字符串的应用很广泛,掌握以下两种应用并能举一
2、反三解决其他相关问题:解决其他相关问题:读入字符串并执行相应的类型转换读入字符串并执行相应的类型转换判断回文判断回文2023/1/162023/1/163 3字符串的定义与存储n哪里需要字符串?哪里需要字符串?文本处理的对象是字符串,描述对象的某一特征的数据也常文本处理的对象是字符串,描述对象的某一特征的数据也常常是字符串(如:姓名、学号、地址、车牌等)常是字符串(如:姓名、学号、地址、车牌等)C C语言中不提供专门的字符串类型,借助于字符数组和字符语言中不提供专门的字符串类型,借助于字符数组和字符指针存储和处理字符串指针存储和处理字符串n什么是字符串:什么是字符串:字符串字符串是是0 0个或
3、多个个或多个有效字符有效字符序列序列 串长:串长:字符串中的有效字符个数字符串中的有效字符个数在源程序中,字符串字面值常量以在源程序中,字符串字面值常量以双引号(不计入串长)双引号(不计入串长)为为定界符定界符存储空间大小:在存储空间大小:在所存的字符串后面自动加字符所存的字符串后面自动加字符00作为作为结束标志,因此存储空间大小结束标志,因此存储空间大小=串长串长+1+1指系统允许使用的字符,包括字母、数指系统允许使用的字符,包括字母、数字字符、专用字符和转义字符字字符、专用字符和转义字符 2023/1/162023/1/164 4字符串的定义与存储n字符串常量存储在字符串常量存储在cons
4、tconst字符数组中,例如:字符数组中,例如:china china BASICa BASICa n区别以下两组:区别以下两组:(1 1)空串)空串(长度为长度为0 0)与空格串与空格串(长度为长度为1 1)(2 2)字符常量)字符常量aa与字符串常量与字符串常量a a 如果串中含有双引号字符,则双引号要用转义字符如果串中含有双引号字符,则双引号要用转义字符c ch hi in na a00B BA AS SI IC Caa 000000a aa a002023/1/162023/1/165 5字符串的赋值nC C语言没有专门的字符串类型,字符串的操作是用语言没有专门的字符串类型,字符串的操
5、作是用一维字符数一维字符数组组和和一级字符指针一级字符指针来实现的。来实现的。n字符串字面值常量字符串字面值常量可以用来给可以用来给字符数组字符数组或或字符指针字符指针作作初始化:初始化:char s18=“china”;/将将“china”“china”的每一个字符(包括串结束符)的每一个字符(包括串结束符)逐一赋值给数组逐一赋值给数组s1s1的各元素的各元素 char s2=3.1416;/相当于相当于char s27=3.1416;char*ps=structure;/系统首先创建系统首先创建const字符型数组存储字符型数组存储structure,然后将存储空间的起始地址赋给字符指针变
6、量,然后将存储空间的起始地址赋给字符指针变量pss1s1c ch hi in na a00s st tr ru uc ct tu ur re 00ps2023/1/162023/1/166 6字符串的赋值n字符串字面值常量字符串字面值常量只能给只能给字符指针赋值字符指针赋值却不能给却不能给字符字符数组赋值:数组赋值:例:例:char s18;s1=china;char*ps;ps=structure;n串指针:串指针:字符串均有字符串均有00字符作为字符作为结束标志结束标志,故只要知,故只要知道串的道串的第一个字符的地址第一个字符的地址,就可以找到字符串。上例,就可以找到字符串。上例中的中的串
7、指针常量串指针常量s1s1和和串指针变量串指针变量psps都可代表字符串都可代表字符串n再论一维字符数组名的再论一维字符数组名的3 3种含义种含义,n例例:char s18=china;(1)(1)代表第一个数组元素的地址,代表第一个数组元素的地址,例例:printf(%cn,*s1);(2)(2)代表整个数组空间,代表整个数组空间,例例:printf(%dn,sizeof(s1);(3)(3)代表字符串,代表字符串,例例:printf(%sn,s1);错误,字符数组名错误,字符数组名s1是是指针常量,不能被赋值指针常量,不能被赋值 正确,将串常量正确,将串常量structure存储空间的存储
8、空间的起始地址赋给字符指针变量起始地址赋给字符指针变量ps 2023/1/162023/1/167 7字符串的输入/输出n字符串的输入和输出有字符串的输入和输出有3 3种基本方法:种基本方法:n例如有定义:例如有定义:char a10,b10,c10;char i;方法方法(1)(1):利用格式控制字符:利用格式控制字符%c%c用循环逐字符处理用循环逐字符处理,例例:for(i=0;i10;i+)scanf(“%c”,&ai);/要加取地址符要加取地址符 for(i=0;i10;i+)printf(“%c”,ai);/不能加取地址符不能加取地址符 方法方法(2)(2):利用格式控制字符:利用格
9、式控制字符%s%s整体处理字符串整体处理字符串,例例:scanf(“%s%s%s”,a,b,c);/输入输入3个字符串,空白符分隔个字符串,空白符分隔printf(“%s-%s-%sn”,a,b,c);/输出输出3个字符串个字符串方法方法(3)(3):利用系统提供的串输入和输出函数处理:利用系统提供的串输入和输出函数处理 gets(a);/输入字符串,允许输入带空格的串输入字符串,允许输入带空格的串puts(a);/输出字符串,并自动换行输出字符串,并自动换行 逐字符输入逐字符输入逐字符输出逐字符输出数组名已是地址,不数组名已是地址,不能再加取地址符能再加取地址符&函数原型函数原型char*g
10、ets(char*ps);可读入带空格的字符串,可读入带空格的字符串,存入指针参量指向的字符数组,并将换行符存入指针参量指向的字符数组,并将换行符n转为串转为串结束符结束符0,函数返回值是串指针,函数返回值是串指针ps。函数原型函数原型int puts(const char*ps);在显示器上输出字符在显示器上输出字符串串ps,串结束符被译为换行,串结束符被译为换行,函数返回值是换行符的代,函数返回值是换行符的代码码10,函数执行失败时的函数返回值是,函数执行失败时的函数返回值是-1。2023/1/162023/1/168 8字符串的输入/输出n注意:注意:用用字符指针字符指针也可操作字符串,
11、但是必须保证每也可操作字符串,但是必须保证每一种操作时指针都是有确定地址的,避免使用一种操作时指针都是有确定地址的,避免使用野指针野指针n例:例:char*ps;gets(ps);n字符串的输入和输出几种方法的比较与分析:字符串的输入和输出几种方法的比较与分析:方法方法(1(1)比较麻烦,一般很少使用比较麻烦,一般很少使用输入:输入:scanf(“%s”,a);scanf(“%s”,a);与与gets(a)gets(a);相比,前者读入串时;相比,前者读入串时以空白符(空格、以空白符(空格、TabTab、回车),故无法读入含空格的串;、回车),故无法读入含空格的串;后者可以读入含空格的串后者可
12、以读入含空格的串输出:输出:printf(“%s”,a);printf(“%s”,a);与与puts(a)puts(a);相比,前者一次可以;相比,前者一次可以输出若干个字符串;后者一次只能输出一个串并自动换行输出若干个字符串;后者一次只能输出一个串并自动换行危险!此时的危险!此时的ps是是“野野”指针指针 2023/1/162023/1/169 9字符串处理函数的原型 n以下是字符串处理函数原型,包含在系统头文件以下是字符串处理函数原型,包含在系统头文件string.hstring.h中,常用以下中,常用以下6 6个:个:(1)unsigned int strlen(const char*s
13、);(2)char*strcpy(char*s1,const char*s2);(3)char*strcat(char*s1,const char*s2);(4)int strcmp(const char*s1,const char*s2);(5)char*strupr(char*s);(6)char*strlwr(char*s);n程序程序9.19.1 字符串处理函数的应用示例字符串处理函数的应用示例 动动态态演示演示过过程程计算串长度的函数,串结束符计算串长度的函数,串结束符0不计不计算在内,函数返回值是串长度算在内,函数返回值是串长度 串拷贝函数,将串串拷贝函数,将串s2复制到指针复制到
14、指针s1指指向的串空间。返回值是串向的串空间。返回值是串s1指针指针 串比较函数,对串串比较函数,对串s1和串和串s2逐个字符比较,相逐个字符比较,相等返等返0;s1大于大于s2返返1;s1小于小于s2返返-1。将串将串s中的小写字母改为大写字母,其余中的小写字母改为大写字母,其余字符不变,返回修改后的串字符不变,返回修改后的串s指针指针 将串将串s中的大写字母改为小写字母,其余中的大写字母改为小写字母,其余字符不变,返回修改后的串字符不变,返回修改后的串s指针。指针。串连接函数,将串串连接函数,将串s2连接到指针连接到指针s1指向的串指向的串后形成更长的串。返回值是串后形成更长的串。返回值是
15、串s1指针指针 2023/1/162023/1/161010部分字符串处理函数的实现n(2 2)字符串复制函数的实现:)字符串复制函数的实现:nchar*strcpy(char*s1,const char*s2);n将第将第2个参数代表的串复制到第个参数代表的串复制到第1个参数所代表的串中个参数所代表的串中并返回第并返回第1个串指针个串指针 n关键思路:关键思路:用循环将串用循环将串2中的字符进行逐字符复制到串中的字符进行逐字符复制到串1中(不能直接用中(不能直接用s1=s2),条件是第,条件是第2个串的当前字符非空。个串的当前字符非空。在循环结束后,要对第在循环结束后,要对第1个串末尾写上串
16、结束标志个串末尾写上串结束标志0n程序程序9.29.2 字符串处理函数的应用示例字符串处理函数的应用示例 n(无动态演示,(无动态演示,VC+VC+下运行)下运行)动动态态演示演示过过程程2023/1/162023/1/161111部分字符串处理函数的实现n(3 3)字符串连接函数的实现:)字符串连接函数的实现:nchar*strcat(char*s1,const char*s2);n将第将第2个参数代表的串连接到第个参数代表的串连接到第1个参数所代表的串后个参数所代表的串后面组成一个新串,并返回第面组成一个新串,并返回第1个串指针个串指针 n关键思路:关键思路:首先用循环使第首先用循环使第1
17、个串定位到该串结束标记个串定位到该串结束标记0处处接着用循环将串接着用循环将串2中的字符进行逐字符复制到串中的字符进行逐字符复制到串1当前位置开当前位置开始处,条件是第始处,条件是第2个串的当前字符非空。个串的当前字符非空。在循环结束后,要对第在循环结束后,要对第1个串末尾写上串结束标志个串末尾写上串结束标志0动动态态演示演示过过程程2023/1/162023/1/161212部分字符串处理函数的实现n(4 4)字符串比较函数的实现:)字符串比较函数的实现:nint strcmp(const char*s1,const char*s2);n将两个参数代表的串对应字符作比较,以第一对不相将两个参
18、数代表的串对应字符作比较,以第一对不相等的字符之间的大小关系决定整个串的大小关系,相等的字符之间的大小关系决定整个串的大小关系,相等返等返0;s1大于大于s2返返1;s1小于小于s2返返-1 n关键思路:关键思路:首先用循环比较两个串对应位置的字符,如果遇到某一对字首先用循环比较两个串对应位置的字符,如果遇到某一对字符不相等,则退出循环结束比较,否则继续下一位,循环条符不相等,则退出循环结束比较,否则继续下一位,循环条件是两个串都未结束件是两个串都未结束循环停止后比较两个串当前字符大小,从而得到函数返回值循环停止后比较两个串当前字符大小,从而得到函数返回值动动态态演示演示过过程程2023/1/
19、162023/1/161313字符串应用举例n数字串转换函数的应用数字串转换函数的应用 n程序程序9.39.3:按字符串的形式输入若干学生的记录的各个按字符串的形式输入若干学生的记录的各个成员,进行相应转换后存储,最后输出各学生记录成员,进行相应转换后存储,最后输出各学生记录n问题分析:问题分析:为了避免为了避免数值型数据、字符型数据和字符串数值型数据、字符型数据和字符串从键盘混合输入从键盘混合输入时,输入缓冲区遗留数据带来的麻烦,引入数字串转换函数。时,输入缓冲区遗留数据带来的麻烦,引入数字串转换函数。所有值都先按字符串输入,再调用函数进行转换所有值都先按字符串输入,再调用函数进行转换ato
20、l:将串转换为长整型值将串转换为长整型值atof:将串转换为浮点型值将串转换为浮点型值需要需要定义结构体类型定义结构体类型表示学生记录表示学生记录若干个学生记录需要若干个学生记录需要定义一维结构数组定义一维结构数组分别定义函数实现输入、输出,分别定义函数实现输入、输出,形参为结构指针形参为结构指针2023/1/162023/1/161414n结构类型的定义:结构类型的定义:nstruct Student /结构定义结构定义nlong unsigned id;/学号学号nchar name20;/姓名姓名ndouble grades;/成绩成绩n;ntypedef struct Student
21、Student;n主函数的代码:主函数的代码:nint main()nStudent sa3;nprintf(Enter 3 records:n);/输入提示输入提示nInput(sa,3);/第一实参为结构数组第一实参为结构数组nprintf(Display 3 records:n);/输出提示输出提示nOutput(sa,3);n return 0;nn输出函数的代码省略,输入部分动态演示:输出函数的代码省略,输入部分动态演示:动动态态演示演示过过程程2023/1/162023/1/161515字符串应用举例 n判断回文判断回文 n程序程序9.49.4:判断一个字符串是否是判断一个字符串是
22、否是回文回文 n算法步骤:算法步骤:表示下标的变量表示下标的变量i i和和j j分别分别“指向指向”字符串的首尾元素。字符串的首尾元素。如果如果i i小于小于j j,则重复步骤,则重复步骤,否则执行步骤,否则执行步骤。如果如果i i指向的是空格符,则指向的是空格符,则i i值加值加1 1,直到指向非空格符为止;如果,直到指向非空格符为止;如果j j指指向的是空格符,则向的是空格符,则j j值减值减1 1,直到指向非空格符为止。然后比较,直到指向非空格符为止。然后比较i i和和j j指向指向的字符,如果不同,则的字符,如果不同,则返回返回0 0,表明不对称,如果相同,则,表明不对称,如果相同,则
23、i i值加值加1 1,j j值值减减1 1,再返回步骤,再返回步骤返回返回1 1,表明字符串对称。,表明字符串对称。n动态演示动态演示:左为判断回文函数,右为主函数:左为判断回文函数,右为主函数去掉空格之后的字去掉空格之后的字符串是中心对称的符串是中心对称的 动动态态演示演示过过程程动动态态演示演示过过程程2023/1/162023/1/161616本章本章小结小结n本章主要介绍了字符串的以下知识:本章主要介绍了字符串的以下知识:字符串字面值常量的表示字符串字面值常量的表示如何对一维字符数组和一级指针初始化如何对一维字符数组和一级指针初始化字符串只能对字符指针赋值不能对数组赋值,需要避免使字符串只能对字符指针赋值不能对数组赋值,需要避免使用野指针用野指针字符串的输入字符串的输入/输出的输出的3 3种控制方式及其比较种控制方式及其比较常用字符串处理函数的原型及使用方法常用字符串处理函数的原型及使用方法三个主要字符串处理函数的实现代码三个主要字符串处理函数的实现代码用字符串解决问题的两个实例用字符串解决问题的两个实例n应该举一反三解决字符串处理的有关问题:应该举一反三解决字符串处理的有关问题:串逆置串逆置求子串求子串串插入、串删除等串插入、串删除等2023/1/162023/1/1617172023/1/1618The end of chapter 9
限制150内