C语言程序设计课件第9章.ppt
2023/7/1,1,高级语言程序设计,第九章 字符串,主讲:计算机学院 朱立华,2023/7/1,3,内容提要,本章介绍字符串的存储与处理的相关知识,掌握以下内容:字符串常量在内存中的存储方式,所占字节数字符串如何利用字符数组和字符指针进行赋值、输入和输出专门用于处理字符串的几个常用函数的原型及实现字符串的应用很广泛,掌握以下两种应用并能举一反三解决其他相关问题:读入字符串并执行相应的类型转换判断回文,2023/7/1,4,字符串的定义与存储,哪里需要字符串?文本处理的对象是字符串,描述对象的某一特征的数据也常常是字符串(如:姓名、学号、地址、车牌等)C语言中不提供专门的字符串类型,借助于字符数组和字符指针存储和处理字符串什么是字符串:字符串是0个或多个有效字符序列 串长:字符串中的有效字符个数在源程序中,字符串字面值常量以双引号(不计入串长)为定界符存储空间大小:在所存的字符串后面自动加字符0作为结束标志,因此存储空间大小=串长+1,指系统允许使用的字符,包括字母、数字字符、专用字符和转义字符,2023/7/1,5,字符串的定义与存储,字符串常量存储在const字符数组中,例如:china BASICa 区别以下两组:(1)空串(长度为0)与空格串(长度为1)(2)字符常量a与字符串常量a 如果串中含有双引号字符,则双引号要用转义字符,2023/7/1,6,字符串的赋值,C语言没有专门的字符串类型,字符串的操作是用一维字符数组和一级字符指针来实现的。字符串字面值常量可以用来给字符数组或字符指针作初始化:char s18=“china”;/将“china”的每一个字符(包括串结束符)逐一赋值给数组s1的各元素 char s2=3.1416;/相当于char s27=3.1416;char*ps=structure;/系统首先创建const字符型数组存储structure,然后将存储空间的起始地址赋给字符指针变量ps,ps,2023/7/1,7,字符串的赋值,字符串字面值常量只能给字符指针赋值却不能给字符数组赋值:例:char s18;s1=china;char*ps;ps=structure;串指针:字符串均有0字符作为结束标志,故只要知道串的第一个字符的地址,就可以找到字符串。上例中的串指针常量s1和串指针变量ps都可代表字符串再论一维字符数组名的3种含义,例:char s18=china;(1)代表第一个数组元素的地址,例:printf(%cn,*s1);(2)代表整个数组空间,例:printf(%dn,sizeof(s1);(3)代表字符串,例:printf(%sn,s1);,错误,字符数组名s1是指针常量,不能被赋值,正确,将串常量structure存储空间的起始地址赋给字符指针变量ps,2023/7/1,8,字符串的输入/输出,字符串的输入和输出有3种基本方法:例如有定义:char a10,b10,c10;char i;方法(1):利用格式控制字符%c用循环逐字符处理,例:for(i=0;i10;i+)scanf(“%c”,/输出字符串,并自动换行,逐字符输入,逐字符输出,数组名已是地址,不能再加取地址符&,函数原型char*gets(char*ps);可读入带空格的字符串,存入指针参量指向的字符数组,并将换行符n转为串结束符0,函数返回值是串指针ps。,函数原型int puts(const char*ps);在显示器上输出字符串ps,串结束符被译为换行,函数返回值是换行符的代码10,函数执行失败时的函数返回值是-1。,2023/7/1,9,字符串的输入/输出,注意:用字符指针也可操作字符串,但是必须保证每一种操作时指针都是有确定地址的,避免使用野指针例:char*ps;gets(ps);字符串的输入和输出几种方法的比较与分析:方法(1)比较麻烦,一般很少使用输入:scanf(“%s”,a);与gets(a);相比,前者读入串时以空白符(空格、Tab、回车),故无法读入含空格的串;后者可以读入含空格的串输出:printf(“%s”,a);与puts(a);相比,前者一次可以输出若干个字符串;后者一次只能输出一个串并自动换行,危险!此时的ps是“野”指针,2023/7/1,10,字符串处理函数的原型,以下是字符串处理函数原型,包含在系统头文件string.h中,常用以下6个:(1)unsigned int strlen(const char*s);(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);程序9.1 字符串处理函数的应用示例,计算串长度的函数,串结束符0不计算在内,函数返回值是串长度,串拷贝函数,将串s2复制到指针s1指向的串空间。返回值是串s1指针,串比较函数,对串s1和串s2逐个字符比较,相等返0;s1大于s2返1;s1小于s2返-1。,将串s中的小写字母改为大写字母,其余字符不变,返回修改后的串s指针,将串s中的大写字母改为小写字母,其余字符不变,返回修改后的串s指针。,串连接函数,将串s2连接到指针s1指向的串后形成更长的串。返回值是串s1指针,2023/7/1,11,部分字符串处理函数的实现,(2)字符串复制函数的实现:char*strcpy(char*s1,const char*s2);将第2个参数代表的串复制到第1个参数所代表的串中并返回第1个串指针 关键思路:用循环将串2中的字符进行逐字符复制到串1中(不能直接用s1=s2),条件是第2个串的当前字符非空。在循环结束后,要对第1个串末尾写上串结束标志0程序9.2 字符串处理函数的应用示例(无动态演示,VC+下运行),2023/7/1,12,部分字符串处理函数的实现,(3)字符串连接函数的实现:char*strcat(char*s1,const char*s2);将第2个参数代表的串连接到第1个参数所代表的串后面组成一个新串,并返回第1个串指针 关键思路:首先用循环使第1个串定位到该串结束标记0处接着用循环将串2中的字符进行逐字符复制到串1当前位置开始处,条件是第2个串的当前字符非空。在循环结束后,要对第1个串末尾写上串结束标志0,2023/7/1,13,部分字符串处理函数的实现,(4)字符串比较函数的实现:int strcmp(const char*s1,const char*s2);将两个参数代表的串对应字符作比较,以第一对不相等的字符之间的大小关系决定整个串的大小关系,相等返0;s1大于s2返1;s1小于s2返-1 关键思路:首先用循环比较两个串对应位置的字符,如果遇到某一对字符不相等,则退出循环结束比较,否则继续下一位,循环条件是两个串都未结束循环停止后比较两个串当前字符大小,从而得到函数返回值,2023/7/1,14,字符串应用举例,数字串转换函数的应用 程序9.3:按字符串的形式输入若干学生的记录的各个成员,进行相应转换后存储,最后输出各学生记录问题分析:为了避免数值型数据、字符型数据和字符串从键盘混合输入时,输入缓冲区遗留数据带来的麻烦,引入数字串转换函数。所有值都先按字符串输入,再调用函数进行转换atol:将串转换为长整型值atof:将串转换为浮点型值需要定义结构体类型表示学生记录若干个学生记录需要定义一维结构数组分别定义函数实现输入、输出,形参为结构指针,2023/7/1,15,结构类型的定义:struct Student/结构定义long unsigned id;/学号char name20;/姓名double grades;/成绩;typedef struct Student Student;主函数的代码:int main()Student sa3;printf(Enter 3 records:n);/输入提示Input(sa,3);/第一实参为结构数组printf(Display 3 records:n);/输出提示Output(sa,3);return 0;输出函数的代码省略,输入部分动态演示:,2023/7/1,16,字符串应用举例,判断回文 程序9.4:判断一个字符串是否是回文 算法步骤:表示下标的变量i和j分别“指向”字符串的首尾元素。如果i小于j,则重复步骤,否则执行步骤。如果i指向的是空格符,则i值加1,直到指向非空格符为止;如果j指向的是空格符,则j值减1,直到指向非空格符为止。然后比较i和j指向的字符,如果不同,则返回0,表明不对称,如果相同,则i值加1,j值减1,再返回步骤返回1,表明字符串对称。动态演示:左为判断回文函数,右为主函数,去掉空格之后的字符串是中心对称的,2023/7/1,17,本章小结,本章主要介绍了字符串的以下知识:字符串字面值常量的表示如何对一维字符数组和一级指针初始化字符串只能对字符指针赋值不能对数组赋值,需要避免使用野指针字符串的输入/输出的3种控制方式及其比较常用字符串处理函数的原型及使用方法三个主要字符串处理函数的实现代码用字符串解决问题的两个实例应该举一反三解决字符串处理的有关问题:串逆置求子串串插入、串删除等,The end of chapter 9,