收藏 分享(赏)

C语言课件06.ppt

上传人:j35w19 文档编号:8115022 上传时间:2019-06-09 格式:PPT 页数:25 大小:220KB
下载 相关 举报
C语言课件06.ppt_第1页
第1页 / 共25页
C语言课件06.ppt_第2页
第2页 / 共25页
C语言课件06.ppt_第3页
第3页 / 共25页
C语言课件06.ppt_第4页
第4页 / 共25页
C语言课件06.ppt_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、第四章,数组(二),第 2 页,本章(二)主要内容,字符数组 概念的引入 字符数组的定义、引用及初始化 程序举例 用于字符串处理的函数,第 3 页,字符数组问题的提出,一个简单的字符型变量只能存放一个字符。对于字符串数据,c语言中是用字符数组来存放的。,字符串是C语言的一种数据类型。它由若干个字符组成,以字符串结束标记0,(ASCII码值为0的字符)作为其最后一个字符。,在程序中,一个字符串在字面上是以一对双引号括起来的若干个字符,也称字符串常量。如“HELLO!“。,问题:从键盘上输入一字符串,统计该字符串的长度。,第 4 页,字符数组问题分析,要完成从键盘上输入一字符串,并统计该字符串的长

2、度。需要解决:,一个字符串可视为一组类型相同(字符型)的有顺序的数据。因此,可以定义字符型数组来存放字符串。字符数组的每个元素都可以作为一个字符型变量存放字符串中对应字符。,字符串长度是指字符串中除字符串结束标记0外的所有字符的个数。例如字符串“ABCde”长度为5,注意:空格也是有效字符。,第 5 页,字符数组程序,#include “string.h“ void main() char a80;int n=0,i=0; /*为长度计数器n和数组下标i赋初值0*/printf(“nInput a string:“);gets(a); /*从键盘接收一字符串并存入字符数组a中*/while(a

3、i+!=0)n+;printf(“Length of “%s“=%dn“,a,n); ,char a80; 定义了一个名为a类型为字符型,大小(长度)为80的数组,因此字符数组a能存放长度不超过79的字符串。因为必须留一个元素存放字符串结束标志0。,从键盘上输入字符串是通过函数调用语句gets(a)来完成的。功能是从键盘上输入一个字符串到指定的字符数组中。,循环语句来完成求字符串长度while(ai+!=0) n+; 从字符数组的第1个元素(下标为0)起,逐个判断,若当前字符不为结束标记0,则长度计数器n加1,直到当前字符为0结束。上述语句可改写为:while(ai! =0) i+;n+;,程

4、序运行结果为: Input a string: Welcome to China! Length of“ Welcome to China!”=17,程序,第 6 页,字符数组概念及定义,用来存放字符数据的数组是字符数组。字符数组中的每个元素都可以看为一字符型变量,可存放一个字符。以其ASCII码的形式存放。字符串是C语言中的字符型数据。它由若干个字符组成,其最后一个字符是字符串结束标志0。在C语言中,字符串是借助于一维数组来存放的。,字符数组的定义字符数组的定义与一、二维数组的相同。例如: char s80; char s540;,第 7 页,字符数组初始化,1逐个字符赋给数组中各个元素,即

5、把所赋初值依次放在一对花括号中。例如: char srt16=H, e, l, l, o, !; char str27=H, e, l, l, o, !, 0;,2直接引用字符串常量给字符数组赋初值。例如: char str27=“Hello!”; char str27= “Hello!”;,3赋初值的字符个数少于数组元素。此时,系统将会自动在其后的元素假如0。例如: char str110=H, e, l, l, o, !; char str210=“Hello!”;,系统会自动在最后加入0,所以不必人为加入。由于定义了str2数组占有7个连续内存单元,因此有足够空间存放字符串。若是定义成:

6、 char str26=“Hello!”; 6个存储单元不够用,结束符0将占用下一个不属于str2的存储单元。,第 8 页,字符数组引用,1逐个引用字符数组中一个元素,得到一个字符。,不论字符数组中存放的是单个字符序列,还是字符串,都可以通过使用数组名及其下标来实现逐个引用字符数组单个字符。输入输出一个字符可利用格式输入函数中格式说明“%c”来完成。 例 6 逐个输出字符数组中单个字符。 void main() char c6=H,e,l,l,o,!;int i;for (i=0; i6; i+)printf(“%c”,ci);/*逐个引用字符数组中的每个元素ci*/printf(“n”);

7、,第 9 页,字符数组引用,2当字符数组存放字符串时,可以一次引用整个字符数组。,字符数组的名字是一个地址常量,它代表的是字符数组的首地址。当字符数组中存放的是字符串时,可把字符数组当为字符串来处理。此时,允许使用数组名一次引用整个数组。可以在调用字符串处理函数时,使用数组名字作实参,也可以使用字符数组名来进行输入输出。但是,不可使用赋值语句给字符数组整体赋一字符串。例如:char str10;str=“Hello C!”; 以上赋值语句是不允许的。因为数组s是一地址常量,不能被重新赋值。,第 10 页,字符数组引用,2当字符数组存放字符串时,可以一次引用整个字符数组。,(1)可以在sanf(

8、)及printf()函数中使用格式说明%s来实现字符串的整体输入和输出。例如:char str10;scanf(“%s”,str); printf(“%s“,str);这里str是数组名,输入字符依次存入以数组首地址为起点的存储单元。并自动在末尾加0。用%s格式符输入字符串时,是以空格符,TAB符,及回车符来结束一个串的输入的。若输入字符串长度超过字符数组所能容纳的字符数时,系统不报错,相当于下标超界。执行输出语句时,将从这一地址开始,依次输出存储单元中的字符,直到遇到一个0结束输出。0不在输出之列。输出结束后不自动换行。,第 11 页,字符数组引用,(2)调用gets( )和puts( )函

9、数实现字符串整体输入输出。例如:char str10;gets(str);其中str接受从键盘读入字符串(包括空格符),直到读入一个换行符为止,系统自动把换行符用0代替。例如,执行上述语句时,若从第一列输入:Helloc! (此处代表空格,代表Enter键)将读入9个字符(包括空格和换行符),系统自动用0代替最后换行符。 用puts( )函数实现字符串整体输出,例如:puts(str);其中str为数组名,执行上述语句时,从数组str首地址开始,依次输出存储单元中字符,遇到第一个0结束输入,并自动输出一个换行。,第 12 页,字符数组引用,例 7 引用数组名输入输出字符串。 void main

10、() char str80;printf(“请输入一字符串:”);gets(str);printf(“n输入的字符串是:”);puts(str); ,程序运行结果: 请输入一字符串:Happy 输入的字符串是:Happy,第 13 页,字符数组程序举例,例 8 编写一程序,实现两个字符串s1和s2的比较,并根据比较的情况输出下列结果: 负数 s1s2,分析:字符串进行比较的方法是:从两字符串(数组)的初始位置(i=0)开始,将它们对应位置(相同下标)的字符的ASCII码值进行比较,只有当前字符相等(s1i=s2i)而且不是两字符串“同时”到尾(s1i!=0),才继续去比较下一个(i值增1)字符

11、。有两种情况会结束比较:第一种是出现不相等字符,第二种是两字符相等,但遇到了串结束符0,不管哪种情况,由当前两个字符相减而得到最后结果。当s1i和s2i不相等,若s1i大于s2i,相减结果大于0,表示s1串大于s2串,若s1i小于s2i,相减结果小于0,表示s1串小于s2串。若两串相等,同时遇到结果标志,相减的值必然等于0。,第 14 页,void main() char s181,s281;int i=0,r;printf(“nInput No.1 string: “);gets(s1); /* 从键盘输入第一个字符串入s1 */printf(“nInput No.2 string: “);

12、 gets(s2); /* 从键盘输入第二个字符串入s2 */while(s1i=s2i ,Input No.1 string:ABCDMFG Input No.2 string:ABCDEFHJK The result is:8,第 15 页,字符数组程序举例,例 9 从键盘上输入一个字符串,并复制到另一个字符数组后显示出来。,void main() char str120,str220; int j=0;printf(”Input a string:”);scanf(“%s”,str1);while(str1j!=0)str2j=str1j; j+;str2j=0;printf(“%s”,

13、str2); ,提示:复制字符串就是将str1串中的字符逐个放到数组str2的对应数组元素中(包括0)。,第 16 页,字符串处理函数,语言中没有提供对字符串进行整体操作的运算符,但提供了很多有关字符串操作的库函数。例如,不能由运算符实现的字符串赋值、合并和比较运算,都可以通过调用库函数来实现。下面介绍4种常用的字符串处理函数。在使用这些函数时,必须在程序前面用命令行指定包含标准头文件“string.h”。,第 17 页,字符串处理函数,1、 求字符串长度函数strlen()。调用形式: strlen(s)此函数计算出以S为其地址的字符串的长度,作为函数值返回。这一长度不包括串尾的结束标志0,

14、编一程序,求字符串的长度。 void main() int j=0;char str1=“string.”;while(str1j!=0) j+;printf(“the lenth of str1=%d”, j); ,#include “string.h”,printf(“the lenth of str1=%d”, strlen(str1);,第 18 页,字符串处理函数,2、字符串复制(拷贝)函数strcpy()。调用形式如下:strcpy(s1,s2)此函数用来把s2所指字符串(源)的内容复制到s1所指存储空间(目的)中,函数返回s1的值,即目的串的首地址。注意:为保证复制的合法性,s1

15、必须指向一个足够容纳s2串的存储空间。,strcpy函数的应用:char str16,str2=“China”;strcpy(str1,str2); 或 strcpy(str1, “China”); 两个字符串拷贝不能使用: str1=str2,字符串拷贝时连同0一起拷贝。,第 19 页,字符串处理函数,3、字符串连接函数strcat()。strcat函数的调用形式如下:strcat(s1,s2);该函数将s2所指字符串的内容连接到s1所指的字符串后面,并自动覆盖s1串末尾的0;函数返回s1地址值。s1所指字符串应有足够空间容纳两串合并后的内容 。,strcat函数的应用: char str1

16、20=“This is a ”; char str2=“string.”; printf(“%s”, strcat(str1,str2); ,运行结果:This is a string.,第 20 页,字符串处理函数,4、 字符串比较函数strcmp()。函数的调用形式如下:strcmp(s1,s2);该函数用来比较s1和s2所指字符串的大小。若串s1串s2,函数值大于0;若串s1=串s2,函数值等于0;若串s1串s2,函数值小于0(负数)。字符串的比较方法是:依次对s1和s2所指字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小(字符大小的依据是其

17、ASCII码值)。,char str1=“Chinese”,str2=“China”; r=strcmp(str1,str2); r=strcmp(str1, “string”); r=strcmp(“string”, “strong”); if(strcmp(str1,str2)=0),两个字符串比较不能使用: if(str1=str2),第 21 页,小结(1),数组是一种整体定义、个别使用的数据结构。数组的整 体特征,在定义一个数组的语句中已经得到了最完整的说明。作为使用的个体,数组中的每个元素都有如下特征:每个数组元素相当于一个同类型简单变量,但又不是孤立的一个简单变量。它是属于一个整

18、体中的一员,这从数组元素的表示方法中可体现出。数组元素引用的方法是: 数组名下标数组名是整体特征,而下标是个体表现。这种使用下标对数组元素进行引用的方法称“下标法”。应该说明一点的是,对数组元素的引用方法除下标法外,还有所谓“指针法”,这将在后续章节中介绍。,第 22 页,小结(2), 数组名是地址常量当程序中定义了一个数组后,系统将会为数组在内存分配一连续内存空间,数组元素按顺序号由小到大依次对应各存储单元,元素a0的地址就是数组的首地址。C语言用数组名来表示这一地址,这是一个地址常量。因此,数组名不能出现在赋值语句中赋值号的左端。一般而言,C语言中只能逐个引用数组元素,而不能使用数组名一次

19、引用整个数组(字符数组除外)。,第 23 页,小结(3),数组下标越界问题当定义了一数组后,数组的大小(长度)即数组元素的个数就确定了。由于C语言中下标的起始值由0开始,因此下标的最大值只能是数组长度减1。所谓数组下标越界的问题是指数组元素引用时,下标小于0或大于等于数组长度。C编译系统在程序运行过程中并不自动检验数组元素的下标是否越界。因此数组两端都可能因为越界而破坏其它存储单元中的数据,甚至破坏了程序代码,出现预料不到的结果。因此,在编写程序时保证数组下标不越界是很重要的。,第 24 页,小结(4),数组元素的顺序处理由于一维数组元素引用时需一个下标,因此一维数组元素的顺序处理总是和单重循

20、环联系在一起的。此时,循环变量就作为数组元小结素的下标变量来使用。循环变量的初值为0而终值就是数组元素的下标上限。,二维数组元素引用需要两个下标,因此二维数组元素的顺序处理总是和两重循环联系在一起。根据程序中具体情况,外层和内层的两个循环变量分别对应数组元素的行(列)下标变量。一般而言,两个循环变量的初值为下标下限,而终值都为行(列)的下标上限 。,对于存放字符串的字符数组,如果要依次处理各元素,有两种方法:如果已知字符串的长度,可以使用次数性循环语句,循环变量的初值是数组元素下标的下限,用字符串长度来控制循环结束;如果不知道字符串的长度,用循环语句来处理字符串时,控制循环结束的条件是当前字符是0,第 25 页,作业,P91 T2、4、7,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报