




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计
2023/2/41第九章字符串主讲:计算机学院俞琼内容提要本章介绍字符串的存储与处理的相关知识,掌握以下内容:字符串常量在内存中的存储方式,所占字节数字符串如何利用字符数组和字符指针进行赋值、输入和输出专门用于处理字符串的几个常用函数的原型及实现字符串的应用很广泛,掌握以下两种应用并能举一反三解决其他相关问题:读入字符串并执行相应的类型转换判断回文2023/2/43字符串的定义与存储哪里需要字符串?文本处理的对象是字符串,描述对象的某一特征的数据也常常是字符串(如:姓名、学号、地址、车牌等)C语言中不提供专门的字符串类型,借助于字符数组和字符指针存储和处理字符串什么是字符串:字符串是0个或多个有效字符序列串长:字符串中的有效字符个数在源程序中,字符串字面值常量以双引号(不计入串长)为定界符存储空间大小:在所存的字符串后面自动加字符’\0’作为结束标志,因此存储空间大小=串长+1指系统允许使用的字符,包括字母、数字字符、专用字符和转义字符2023/2/44字符串的定义与存储字符串常量存储在const字符数组中,例如:"china""BASIC\a"区别以下两组:(1)空串""(长度为0)与空格串""(长度为1)(2)字符常量’a’与字符串常量"a"如果串中含有双引号字符,则双引号要用转义字符\"china\0BASIC\a\0\0\0aa\02023/2/45字符串的赋值C语言没有专门的字符串类型,字符串的操作是用一维字符数组和一级字符指针来实现的。字符串字面值常量可以用来给字符数组或字符指针作初始化:chars1[8]=“china”; //将“china”的每一个字符(包括串结束符)逐一赋值给数组s1的各元素
chars2[]="3.1416"; //相当于chars2[7]="3.1416";char*ps="structure"; //系统首先创建const字符型数组存储"structure",然后将存储空间的起始地址赋给字符指针变量pss1china\0structure\0ps2023/2/46字符串的赋值字符串字面值常量只能给字符指针赋值却不能给字符数组赋值:例:chars1[8]; s1="china";char*ps; ps="structure";串指针:字符串均有\0字符作为结束标志,故只要知道串的第一个字符的地址,就可以找到字符串。上例中的串指针常量s1和串指针变量ps都可代表字符串再论一维字符数组名的3种含义,例:chars1[8]="china";
(1)代表第一个数组元素的地址,例:printf("%c\n",*s1);
(2)代表整个数组空间,例:printf("%d\n",sizeof(s1));
(3)代表字符串,例:printf("%s\n",s1);
错误,字符数组名s1是指针常量,不能被赋值正确,将串常量structure存储空间的起始地址赋给字符指针变量ps
2023/2/47字符串的输入/输出字符串的输入和输出有3种基本方法:例如有定义:chara[10],b[10],c[10];chari;
方法(1):利用格式控制字符%c用循环逐字符处理,例:for(i=0;i<10;i++)scanf(“%c”,&a[i]);//要加取地址符
for(i=0;i<10;i++)printf(“%c”,a[i]);
//要加取地址符
方法(2):利用格式控制字符%s整体处理字符串,例:scanf(“%s%s%s”,a,b,c); //输入3个字符串,空白符分隔printf(“%s-%s-%s\n”,a,b,c);
//输出3个字符串方法(3):利用系统提供的串输入和输出函数处理
gets(a);//输入字符串,允许输入带空格的串puts(a);
//输出字符串,并自动换行
逐字符输入逐字符输出数组名已是地址,不能再加取地址符&函数原型char*gets(char*ps);可读入带空格的字符串,存入指针参量指向的字符数组,并将换行符\n转为串结束符\0,函数返回值是串指针ps。函数原型int
puts(constchar*ps);在显示器上输出字符串ps,串结束符被译为换行,函数返回值是换行符的代码10,函数执行失败时的函数返回值是-1。2023/2/48字符串的输入/输出注意:用字符指针也可操作字符串,但是必须保证每一种操作时指针都是有确定地址的,避免使用野指针例:char*ps;gets(ps);字符串的输入和输出几种方法的比较与分析:方法(1)比较麻烦,一般很少使用输入:scanf(“%s”,a);与gets(a);相比,前者读入串时以空白符(空格、Tab、回车),故无法读入含空格的串;后者可以读入含空格的串输出:printf(“%s”,a);与puts(a);相比,前者可以输出若干个字符串;后者一次只能输出一个串并自动换行危险!此时的ps是“野”指针2023/2/49字符串处理函数的原型
以下是字符串处理函数原型,包含在系统头文件string.h中,常用以下6个:(1)unsignedint
strlen(constchar*s);
(2)char*strcpy(char*s1,constchar*s2); (3)char*strcat(char*s1,constchar*s2);(4)int
strcmp(constchar*s1,constchar*s2);(5)char*strupr(char*s);(6)char*strlwr(char*s); 程序9.1
字符串处理函数的应用示例计算串长度的函数,串结束符\0不计算在内,函数返回值是串长度串拷贝函数,将串s2复制到指针s1指向的串空间。返回值是串s1指针串连接函数,是将串s2接到串s1的尾部,返回值是连接后的串s1指针串比较函数,对串s1和串s2逐个字符比较,相等返0;s1大于s2返1;s1小于s2返-1。将串s中的小写字母改为大写字母,其余字符不变,返回修改后的串s指针将串s中的大写字母改为小写字母,其余字符不变,返回修改后的串s指针。动态演示过程2023/2/410部分字符串处理函数的实现
(2)字符串复制函数的实现:char*strcpy(char*s1,constchar*s2);将第2个参数代表的串复制到第1个参数所代表的串中并返回第1个串指针 关键思路:用循环将串2中的字符进行逐字符复制到串1中(不能直接用s1=s2),条件是第2个串的当前字符非空。在循环结束后,要对第1个串末尾写上串结束标志\0程序9.2
字符串处理函数的应用示例(无动态演示,VC++下运行)动态演示过程2023/2/411部分字符串处理函数的实现
(3)字符串连接函数的实现:char*strcat(char*s1,constchar*s2);将第2个参数代表的串连接到第1个参数所代表的串后面组成一个新串,并返回第1个串指针 关键思路:首先用循环使第1个串定位到该串结束标记\0处接着用循环将串2中的字符进行逐字符复制到串1当前位置开始处,条件是第2个串的当前字符非空。在循环结束后,要对第1个串末尾写上串结束标志\0动态演示过程2023/2/412部分字符串处理函数的实现
(4)字符串比较函数的实现:int
strcmp(constchar*s1,constchar*s2);将两个参数代表的串对应字符作比较,以第一对不相等的字符之间的大小关系决定整个串的大小关系,相等返0;s1大于s2返1;s1小于s2返-1
关键思路:首先用循环比较两个串对应位置的字符,如果遇到某一对字符不相等,则退出循环结束比较,否则继续下一位,循环条件是两个串都未结束循环停止后比较两个串当前字符大小,从而得到函数返回值动态演示过程2023/2/413字符串应用举例
数字串转换函数的应用
程序9.3:按字符串的形式输入若干学生的记录的各个成员,进行相应转换后存储,最后输出各学生记录问题分析:
为了避免数值型数据、字符型数据和字符串从键盘混合输入时,输入缓冲区遗留数据带来的麻烦,引入数字串转换函数。所有值都先按字符串输入,再调用函数进行转换atol:将串转换为长整型值atof:将串转换为浮点型值需要定义结构体类型表示学生记录若干个学生记录需要定义一维结构数组分别定义函数实现输入、输出,形参为结构指针2023/2/414结构类型的定义:structStudent
//结构定义{ longunsignedid; //学号
charname[20]; //姓名
doublegrades; //成绩};typedef
structStudent
Student;主函数的代码:intmain(){
Studentsa[3];
printf("Enter3records:\n"); //输入提示
Input(sa,3);//第一实参为结构数组
printf("Display3records:\n"); //输出提示
Output(sa,3); return0;}输出函数的代码省略,输入部分动态演示:动态演示过程2023/2/415字符串应用举例
判断回文程序9.4:判断一个字符串是否是回文
算法步骤:
①表示下标的变量i和j分别“指向”字符串的首尾元素。②如果i小于j,则重复步骤③,否则执行步骤④。③如果i指向的是空格符,则i值加1,直到指向非空格符为止;如果j指向的是空格符,则j值减1,直到指向非空格符为止。然后比较i和j指向的字符,如果不同,则返回0,表明不对称,如果相同,则i值加1,j值减1,再返回步骤②④返回1,表明字符串对称。动态演示:左为判断回文函数,右为主函数去掉空格之后的字符串是中心对称的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生铁项目安全风险评价报告
- 中国猪饲料行业市场评估分析及投资发展盈利预测报告
- 智慧城市公共服务中的AI技术应用案例分析
- 中国抗原虫药物行业调查报告
- 2025年中国高端路由器行业市场全景监测及投资战略咨询报告
- 2025年中国电子产品塑胶模具行业市场发展前景及发展趋势与投资战略研究报告
- 中国青霉胺行业市场调查报告
- 2024年全球及中国全周期网站开发服务行业头部企业市场占有率及排名调研报告
- 2025-2030年中国自行车双支架项目投资可行性研究分析报告
- 中国云计算软件服务行业发展监测及投资战略研究报告
- 《国资委产权局》课件
- 中国航天新材料行业深度分析、投资前景、趋势预测报告(咨询)
- 9.2 严格执法 教案 2024-2025学年高中政治《政治与法治》(统编版必修3)
- 吉林省2024年中考地理试卷2套附解析答案
- 山东省济南市历城区2025年九年级中考语文一模考试试题(含答案)
- 2025年全国中学生数学奥林匹克竞赛(预赛)模拟卷(全国高中数学联赛一试)(含解析)
- 民兵培训课件
- 2025年河北省沧州市初中学业水平摸底考试地理试卷(含答案)
- 危重患者血糖管理指南
- 新时代六尺巷工作法时政复习-2025届高考政治二轮复习统编版
- 《公路运营领域重大事故隐患判定标准》知识培训
评论
0/150
提交评论