数组字符串指针及其应.ppt
《数组字符串指针及其应.ppt》由会员分享,可在线阅读,更多相关《数组字符串指针及其应.ppt(67页珍藏版)》请在三一办公上搜索。
1、程序设计-2005年秋,1,第7讲数组、字符串、指针及其应用(Part II),周水庚2005年10月26日,程序设计-2005年秋,2,数组的基本概念一维数组多维数组字符数组和字符串指针和数组,提要,程序设计-2005年秋,3,数组,定义形式类型说明符 数组名常量表达式;类型说明符 数组名常量表达式常量表达式;引用形式数组名下标数组名下标下标,程序设计-2005年秋,4,数组的基本概念一维数组多维数组字符数组和字符串指针和数组,提要,程序设计-2005年秋,5,字符数组,字符数组定义形式与其他数组定义形式一样 char 字符数组名元素个数;如:char s5;表示数组s有5个元素,每个元素能
2、存放一个字符,整个数组最多可存放5个字符当存于字符数组中的字符列最后有ASCII码值为0(记为0)时,称该数组中的字符列为字符串。并称字符0为字符串结束标志符,程序设计-2005年秋,6,字符数组初始化,字符数组除可以与普通数组一样初始化外,也可利用字符串常量给字符数组初始化。用字符串常量对字符数组初始化时,系统会在字符列未尾添加一个字符串结束符如:char a_str=I am happy!;或简写为 char a_str=I am happy!;数组a_str有12个元素,其中a_str11的值是字符串的结束标志符0如:char str_list30=I am happy!,I am le
3、arning c language.;字符数组str_list0和字符数组str_list1各可存储30个字符,现分别存储有11个有效字符的字符串和有25个有效字符的字符串,程序设计-2005年秋,7,字符串,称最后有字符串结束符的字符序列为字符串字符数组中存储的字符序列本身并不要求最后要有字符0。但当字符数组内存储的内容需要作为字符串时,就必须要有标志符 0当字符数组内存储的是字符串时,可用”%s”格式输出,若是普通的字符序列,则它不能用格式”%s”,而只能用格式”%c”char s1=student;char s2=s,t,u,d,e,n,t;则 printf(“%s”,s1);是正确的而
4、 printf(“%s”,s2);是错误的实际上字符数组s1有8个元素;s2只有7个元素,程序设计-2005年秋,8,字符串与字符数组,文字信息可作为字符串来处理,而字符串又以字符数组的形式来组织存储字符数组需预先指定长度以保证能存放足够长的文字信息但限定长度对使用是不方便的。例如定义的字符数组:char str120可存储120个字符,如用它来接受输入或组织输出,每次必须键入120个字符,或总得输出120个字符。显然是不合理的,因为通常输入输出的字符个数均小于120为能使存于字符数组中的字符串的实际长度可长可短,且其长度可随时测定,两个长度不相等的字符串能按字典顺序比较,C语言为字符串规定了
5、一个字符串结束标志符0,程序设计-2005年秋,9,字符串常量,字符串常量的书写形式为:字符序列其中字符序列可由零个或多个字符组成,如字符串常量”I am a student.”含15个有效字符字符串常量”不含任何有效字符,其长度为0,习惯称为空字符串在字符串常量的书写形式中,双引号“只充当字符串的界限符,不是字符串的一部分如果字符串要包含字符“,则可经过转义序列(如”)来实现,其它转义序列(如n,t)也可以作为单个字符出现在字符串常量中。如 tThis is a string.n,程序设计-2005年秋,10,字符串常量串接规则,通常字符串写在一行内。如果一个字符串常量在一行内写不下时,可用
6、字符串常量的串接规则把字符串分成连续多行形式书写字符串常量串接规则有两条在键入字符 之后紧接键入回车键。如“I am a st(回车换行符)ring.“就是字符串常量 I am a string.“连续两个紧接的字符串常量相当于一个字符串常量。如 I am a string.“也是字符串常量 I am a string.,程序设计-2005年秋,11,字符串输入输出,字符串的输入输出可以有两种方式用格式“%c”,结合循环结构逐个字符输入或输出用格式“%s”,将字符串整体地输入或输出例如:char s=C language;用第一种方法输出 for(i=0;si;+i)printf(%c,si)
7、;用第二种方法输出 printf(%s,s);,程序设计-2005年秋,12,字符串注意点-1,1-字符串与存储字符串的字符数组有区别字符串的有效字符是指从所指位置的第一个字符开始至字符串结束标志符之前的那些字符。如:char str50=Pas0cal Cobol Fortran C;printf(%sn,str);将只输出 Pas而实际上,数组str在字符串结束符之后还存有其它许多字符,程序设计-2005年秋,13,字符串注意点-2&3,用“%s”格式输出字符串时,不包括字符串结束标志符对应的输出项是字符串或字符串名。字符数组名可作为字符串名在调用scanf()为字符数组输入字符串时,输入
8、项是数组名,不要加地址运算符 用“%s”格式输入字符串时,掠过前导的空白类字符,只能输入一串不含空白类字符的字符序列,遇空白类字符,或输入了格式指定的字符个数,就结束输入若要输入一串包括空格符在内的一行字符,要用字符行输入函数gets(),程序设计-2005年秋,14,字符串注意点-4,若用”%c”格式结合循环输入字符序列,若程序又想将输入的字符序列构成字符串,则程序必须用赋值语句在字符列之后存入字符串结束标志符如:char s20;int k;for(k=0;k 5;k+)scanf(”%c”,程序设计-2005年秋,15,常用字符串处理函数,求字符串长度函数 strlen()函数调用str
9、len(str)返回str中的有效字符(不包括0)个数字符串拷贝函数strcpy()函数调用strcpy(str1,str2)将字符串str2复制拷贝到字符数组str1。限定字符数组str1要定义得足够大,以便能容纳被拷贝的str2的全部内容。限制:str1不能是字符串常量,程序设计-2005年秋,16,常用字符串处理函数(续),字符串拷贝函数strncpy()函数调用strncpy(str1,str2,n)的作用是将str2中的前n个字符拷贝到str1(并附加0)其中n是整型表达式,指明欲拷贝的字符个数。如果str2中的字符个数不多于n,则函数调用strncpy(str1,str2,n)等价
10、于strcpy(str1,str2)。限制:str1不能是字符串常量,程序设计-2005年秋,17,常用字符串处理函数(续),字符串连接函数 strcat()函数调用strcat(str1,str2)将str2内容拷贝接在字符数组str1中的字符串的后面限制str1不能是字符串常量。该函数调用返回str1的开始地址。注意,字符串连接前,str1和str2都各自有0,连接后,str1中原来的0 在拷贝时被覆盖掉,而在新的字符串有效字符之后再保留一个0例如char str130=Beijing;char str230=Shanghai;strcat(str1,str2);printf(%sn,st
11、r1);将输出 BeijingShanghai,程序设计-2005年秋,18,常用字符串处理函数(续),字符串比较函数 strcmp()函数调用strcmp(str1,str2)比较两个字符串的大小,对两个字符串自左至右逐对字符相比较(按字符的ASCII代码值的大小),直至出现不同的字符或遇到0字符为止。如直至0字符,全部字符都相同,则认为相等,函数返回0值若出现不同的字符,则以这第一个不相同的字符比较结果为准,若str1的那个不相同字符小于str2的相应字符,函数返回一个负整数;反之,返回一个正整数注意,对字符串不允许施行相等“=”和不相等“!=”运算,必须类似于本函数那样,通过逐个字符比较
12、来实现,程序设计-2005年秋,19,常用字符串处理函数(续),字符串大写英文字符转换成小写英文字符函数strlwr()函数调用strlwr(str)将存于字符数组str的字符串内的大写英文字符转换成小写英文字符。限制str不能是字符串常量字符串小写字母转换成大写字母函数 strupr()函数调用 strupr(str)将存于字符数组str的字符串内的小写英文字符转换成大写英文字符。同样限制str不能是字符串常量,程序设计-2005年秋,20,常用字符串处理函数(续),字符串输出函数 puts()函数调用puts(str)将str的字符串输出到终端,并将str中的0字符转换成换行符n。即输出字
13、符串内容后,并换行。所以puts(str)相当于printf(”%sn”,str)字符串输入函数 gets()函数调用gets(str)从终端输入字符序列到字符数组str,字符序列以回车符作为结束,并将输入时的回车符转换成0字符存储。该函数调用返回str的存储开始地址,程序设计-2005年秋,21,字符数组和字符串应用样例-1,#include char s1100,s2100,s3100;void main()printf(输入字符序列s1n);scanf(%s,s1);while(getchar()!=n);printf(s1=%sn,s1);strcpy(s2,s1);strncpy(s
14、3,s1,5);printf(从s1拷贝的s2=%sn,s2);printf(从s1只拷贝5个字符的s3=%sn,s3);strcat(s1,s3);printf(接上s3的s1=%sn,s1);printf(输入字符行到s1n);gets(s1);printf(s1=%sn,s1);strcpy(s2,s1);strncpy(s3,s1,5);puts(s2);puts(s3);strcat(s1,s3);puts(s1);,程序示例:说明上述库函数的应用,程序设计-2005年秋,22,字符数组和字符串应用样例-2,输入字符行,统计各英文字母出现的次数程序设计分析程序需要一个存储字符行的数组
15、,还需要52个英文字母计数器,统计52个英文字母的出现次数顺序扫视输入的字符行中的字符,直至遇字符串结束符结束。当程序发现当前字符是英文字母时,对应英文字母的计数器增1,否则掠过当前字符用数组count52实现52个计数器,并设大写英文字符顺序对应前26个计数器(count0-count25),小写英文字符顺序对应后26个计数器(count26-count51),程序设计-2005年秋,23,字符数组和字符串应用样例-2(续),#include void main()char buf120;int i,count52;printf(Enter letter line.n);gets(buf);
16、for(i=0;i=A,输入字符行,统计各英文字母出现的次数,程序设计-2005年秋,24,字符数组和字符串应用样例-3,输入字符行,统计其中单词个数。约定单词由英文字母组成,其它字符只是用来分隔单词程序设计分析 设置单词计数器等初值;输入一行字符(如用gets()函数);顺序扫视输入的字符行(如用for语句)判定当前字符是否是字母;if(现在正在单词中)if(当前字符不是字母)设置当前状态不在单词中的标志;else if(当前字符是字母)设置当前状态在单词中的标志;单词计数器增;/*状态有不是单词变为单词时,进行统计*/,程序设计-2005年秋,25,字符数组和字符串应用样例-3(续),#i
17、nclude void main()char c,line120;int i,words,inword,letter;words=0;inword=0;/*预置状态不在单词中*/printf(Input a line.n);gets(line);for(i=0;linei;i+)c=linei;letter=(c=a,输入字符行,统计其中单词个数。约定单词由英文字母组成,其它字符只是用来分隔单词,程序设计-2005年秋,26,字符数组和字符串应用样例-4,#include#include#define MAXLINE 256void main()int len,max;char line MA
18、XLINE,save MAXLINE;max=0;for(;)printf(“输入字符行(回车结束).n);gets(line);if(len=strlen(line)=0)break;if(len max)max=len;strcpy(save,line);if(max 0)printf(“最长行是:n%sn,save);,读入一串字符行,以空行(即只键入回车符的行)结束,输出其中最长的行,程序设计-2005年秋,27,字符数组和字符串应用样例-5,描绘图像 r()=sin(2)程序设计分析用字符在显示屏上描绘 r=r()图像的一般方法当变化时,r()描绘出一个封闭平面图,用一个二维字符数组
19、代表图像r()的画面,可定义为 char canvas 2480;普通显示屏在25mm(一英寸)见方的区域上纵向 5.5 行,横向约10列。按这个比例设定X、Y的比例。约定屏幕左上角的字符位置对应canvas00,图像坐标系的原点位于 canvas1240取0到360范围内的值,步长为1。对于具体函数,应充分利用函数图像对称性:X 轴对称、Y 轴对称、关于原点中心对称等,程序设计-2005年秋,28,字符数组和字符串应用样例-5(续),描绘图像 r()=sin(2)(续)程序设计分析(续)描绘图像程序的算法结构 置画面数组为全空白符;for(seta=0;seta 360;seta+)alph
20、a=seta/180.0*pi;r=r(seta)*scale;x=r*cos(alpha);y=r*sin(alpha);i=12-(int)(0.55*y);/*屏幕的行号递增方向与图像 Y 轴的方向相反*/j=40+x;canvasij=*;,程序设计-2005年秋,29,字符数组和字符串应用样例-5(续),#include#include#define SCALE 20.0#define MID 12#define PI 3.14159#define RATE 0.55void main()char canvas2*MID80;double r,alpha,x,y;int i,j,se
21、ta;for(i=0;i 2*MID;i+)for(j=0;j 80;j+)canvasij=;,描绘图像 r()=sin(2)(续)对于本题,scale 可定义为20。以下程序利用图像关于X 轴、Y轴及关于直线Y=X的对称性,for(i=0;i2*MID;i+)canvasi79=0;for(seta=0;seta45;seta+)alpha=seta/180.0*PI;r=sin(2*alpha)*SCALE;x=r*cos(alpha);y=r*sin(alpha);i=(int)(RATE*y);j=(int)(x);,程序设计-2005年秋,30,字符数组和字符串应用样例-5(续),
22、canvasMID+i40+j=/*X 轴对称*/canvasMID+i40-j=/*中心对称*/canvasMID-i40-j=/*Y轴对称*/canvasMID-i40+j=*;/*本身图像点*/i=(int)(RATE*x);/*关于直线X=Y 对称*/j=(int)(y);canvasMID+i40+j=/*X 轴对称*/canvasMID+i40-j=/*中心对称*/canvasMID-i40-j=/*Y轴对称*/canvasMID-i40+j=*;/*本身图像点*/for(i=0;i 2*MID;i+)puts(canvasi);,描绘图像 r()=sin(2)(续)对于本题,sc
23、ale 可定义为20。以下程序利用图像关于X 轴、Y轴及关于直线Y=X的对称性,程序设计-2005年秋,31,数组的基本概念一维数组多维数组字符数组和字符串指针和数组,提要,程序设计-2005年秋,32,指针和数组,指向数组元素的指针当指针变量指向数组的元素时,就可用指针引用数组的元素设有以下变量定义int a100,*p;赋值运算 p=&a0使p指向a0表示&a0还有更简洁的方法,即数组名a让指针指向数组元素,不仅为引用数组元素提供了一种新的途径,更主要的是指向数组元素的指针所具有的运算能力,特别适宜描述对数组元素的成批处理,比用下标引用数组元素更灵活和简洁,程序设计-2005年秋,33,指
24、向数组元素的指针,对指向数组元素的指针允许作有限的运算设有以下代码 int*p,*q,a100;p=当两个指针指向同一个数组的元素时,这两个指针可以作关系比较(,=,!=)若两指针p和q指向同一个数组的元素,则p=q为真表示p,q指向数组的同一个元素;若pq为真,表示p所指向的数组元素的下标小于q所指向的数组元素的下标。如对上述代码pq为真,程序设计-2005年秋,34,指向数组元素的指针(续),对指向数组元素的指针允许作有限的运算(续)指向数组元素的指针可与整数进行加减运算由数组元素在内存中顺序连续存放的规定,以及地址运算规则,表达式a+1为a1 的地址,a+2为a2的地址。一般地,表达式a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 字符串 指针 及其

链接地址:https://www.31ppt.com/p-6297460.html