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