第7章 数组.ppt

上传人:豆**** 文档编号:77586316 上传时间:2023-03-15 格式:PPT 页数:82 大小:1.34MB
返回 下载 相关 举报
第7章 数组.ppt_第1页
第1页 / 共82页
第7章 数组.ppt_第2页
第2页 / 共82页
点击查看更多>>
资源描述

《第7章 数组.ppt》由会员分享,可在线阅读,更多相关《第7章 数组.ppt(82页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第7章章 数组数组问题:问题:给一组数排序,这组给一组数排序,这组 数该数该 如何存放呢如何存放呢?这些数据如何存放才便于排序82945637617188888888881111111111111118 8 88888888这便是本章所要解决的问题第七章第七章 数组数组l l 本章要点第七章第七章 数组数组l l 主要内容7.1 7.1 一维数组的定义和引用一维数组的定义和引用7.2 7.2 二维数组的定义和引用二维数组的定义和引用7.3 7.3 字符数组字符数组第七章第七章 数组数组 7-17-1 一维数组的定义和引用一维数组的定义和引用 问题:问题:问题:问题:有如下几组数据,它们分别该

2、如何存储呢?有如下几组数据,它们分别该如何存储呢?是一组具有是一组具有相同数据类型相同数据类型的数据的的数据的有序集合。有序集合。数组数组 一个班学生的学习成绩一行文字一个矩阵这些数据的特点是:这些数据的特点是:1、具有相同的数据类型、具有相同的数据类型2、使用过程中需要保留原始数据、使用过程中需要保留原始数据 C语言为这些数据,提供了一种语言为这些数据,提供了一种构造数据类型:数组。构造数据类型:数组。1、一维数组的定义格式为:一维数组的定义格式为:类型说明符类型说明符 数组名常量表达式;数组名常量表达式;例如:例如:int a int a1010;它它表表示示定定义义了了一一个个整整形形数

3、数组组,数数组组名名为为a a,此此数数组组有有1010个元素。个元素。7.1.1 7.1.1一维数组的定义一维数组的定义 2 2、说明:、说明:(1 1)数组名定名规则和变量名相同,遵循标识符定名规则。(2 2)在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。例如,指定a10,表示a数组有10个元素,注意下标是从0开始的,这10个元素是,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。请持别注意,按上面的定义,不存在数组元素a10。(3 3)常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义

4、,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:举例:举例:int n;int n;scanf(“%d scanf(“%d,&n);&n);/*/*在程序中临时输入在程序中临时输入数数 组的大小组的大小*/*/int a int an n;float afloat a0 0;/*/*数组大小为数组大小为0 0没有意义没有意义*/*/int b(2)(3);int b(2)(3);/*/*不能使用圆括号不能使用圆括号*/*/int k,ak;int k,ak;/*/*不能用变量说明数组大小不能用变量说明数组大小*/*/数组申明中常见的错误数组申明中常见的错误数组申明

5、中常见的错误数组申明中常见的错误3、一维数组在内存中的存放一维数组在内存中的存放每个数据元素占用的每个数据元素占用的字节数,就是字节数,就是基类型基类型的字节数的字节数一个元素占一个元素占4个个字节字节一维数组:一维数组:floatfloat markmark100;100;mark0mark1mark2mark3.mark9986.592.077.552.0.94.0低地址低地址 高地址高地址数组名下标数组名下标下标可以是整型常量或整型表达式。例如下标可以是整型常量或整型表达式。例如:a a0 0=a=a5 5+a+a7 7-a-a2*32*3定义数组时用到的“数组名常量表达式”和引用数组元

6、素时用到的“数组名下标”是有区别的。例如 int a10;/*定义数组长度为10*/t=a6;/*引用a数组中序号为6的元 素。此时6不代表数组长度*/注意注意 7.1.2 7.1.2一维数组元素的引用一维数组元素的引用1 1、数组元素的引用方式:、数组元素的引用方式:2 2、一维数组元素引用的、一维数组元素引用的程序实例程序实例程序实例程序实例#include void main()int i,a10;for(i=0;i=0;i-)printf(%d,ai);printf(n);运行结果如下:运行结果如下:9 8 7 6 5 4 3 2 1 0 程序使a0到a9的值为09,然后按逆序输出。1

7、、对数组元素初始化的实现方法:对数组元素初始化的实现方法:(1 1)在定义数组时对数组元素赋以初值。例如)在定义数组时对数组元素赋以初值。例如:int aint a1010=0=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9;9;将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。7.1.3 7.1.3一维数组的初始化一维数组的初始化 (3 3)如果想使一个数如果想使一个数组组中全部元素中全部元素值为值为0 0,可以写成可以写成 int aint a1010

8、=0=0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0;0;或或int aint a1010=0;=0;不不能写成能写成:int aint a1010=0*10;=0*10;这是与FORTRAN语言不同的,不能给数组整体赋初值。2 2)可以只给一部分元素赋值。例如)可以只给一部分元素赋值。例如:int aint a1010=0=0,1 1,2 2,3 3,4;4;定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。4 4)在在对对全部数全部数组组元素元素赋赋初初值时值时,由于数据的个数已,由于数据的个数已经经确定,因此可以不指

9、定数确定,因此可以不指定数组长组长度。度。例如例如:int aint a5 5=1=1,2 2,3 3,4 4,5;5;也可以写成也可以写成 int a=1,2,3,4,5;在第二种写法中,花括弧中有5个数,系统就会据此自动定义a数组的长度为5。但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成 int aint a1010=1=1,2 2,3 3,4 4,5;5;只初始化前5个元素,后5个元素为0。课堂练习课堂练习下列的数组定义哪个是正确的(1)int a;float a10;int a03;(2)int i=3,j=4;

10、int aij;(3)#define FD 5 main()int a3+2,b7+FD;(4)16 练习:从键盘中输入练习:从键盘中输入练习:从键盘中输入练习:从键盘中输入1010个数字,比较并输出其个数字,比较并输出其个数字,比较并输出其个数字,比较并输出其中最大的数。中最大的数。中最大的数。中最大的数。编程思路:编程思路:编程思路:编程思路:定义一个数组定义一个数组定义一个数组定义一个数组 给数组赋值给数组赋值给数组赋值给数组赋值(输入输入输入输入1010个数个数个数个数)逐个比较每个数的大小逐个比较每个数的大小逐个比较每个数的大小逐个比较每个数的大小 输出最大的数输出最大的数输出最大的

11、数输出最大的数171)定义一个数组,可包含十个数字)定义一个数组,可包含十个数字float a10;2)给数组赋值给数组赋值(输入输入10个数个数)最好再加上一个提示语句:最好再加上一个提示语句:printf(input 10 numbers:n);for(i=0;i10;i+)/数组元素赋初值数组元素赋初值 scanf(%f,&ai);183)逐个比较每个数的大小,找出最大的数)逐个比较每个数的大小,找出最大的数 先定义一个中间变量先定义一个中间变量max,依次与数组的每,依次与数组的每一个元素比较,将大数存储在中间变量中一个元素比较,将大数存储在中间变量中max=a0;for(i=1;im

12、ax)max=ai;printf(maxmum=%fn,max);最后打印出最后打印出max的值的值19源程序如下:源程序如下:源程序如下:源程序如下:#include#include stdio.hstdio.h main()main()int i int i;float max,;float max,a10;a10;printf(printf(input 10 numbers:n);input 10 numbers:n);for(ifor(i=0;i10;i+)=0;i10;i+)/数组元素赋初值数组元素赋初值数组元素赋初值数组元素赋初值 scanf(scanf(%f f,&ai);,&a

13、i);max=a0;max=a0;for(ifor(i=1;i10;i+)=1;imax)max=ai;max)max=ai;printf(printf(max=%max=%f fn,max);n,max);20 如果将赋初值的程序行改为:如果将赋初值的程序行改为:如果将赋初值的程序行改为:如果将赋初值的程序行改为:printf(input 10 numbers:n);printf(input 10 numbers:n);for(i=0;i10;i+)/for(i=0;i10;i+)/数组元素赋初值数组元素赋初值数组元素赋初值数组元素赋初值 scanf(“%d”,scanf(“%d”,a+ia

14、+i););结果会怎样呢?结果会怎样呢?结果会怎样呢?结果会怎样呢?21如果再加多一行:如果再加多一行:如果再加多一行:如果再加多一行:printf(input 10 numbers:n);printf(input 10 numbers:n);for(i=0;i10;i+)/for(i=0;i10;i+)/数组元素赋初值数组元素赋初值数组元素赋初值数组元素赋初值 printf(%ldt,a+i);printf(%ldt,a+i);scanf(%d,a+i);scanf(%d,a+i);22/*/*错误编程错误编程*/*/main()main()main()main()int int int i

15、nt a4=1,2,3,4,b4;a4=1,2,3,4,b4;a4=1,2,3,4,b4;a4=1,2,3,4,b4;a=b;a=b;a=b;a=b;解决方法解决方法法法1:逐个元素赋值逐个元素赋值 b0=a0;b1=a1;b2=a2;b3=a3;法法2:通过循环赋值通过循环赋值 int i;for(i=0;i4;i+)bi=ai;原因原因:数组名表示数组的首数组名表示数组的首地址地址,其值不可改变其值不可改变!如何使两个数组的值相等如何使两个数组的值相等:23#include stdio.h#include stdio.h#include stdio.h#include stdio.h ma

16、in()main()main()main()int i,j,p,q,s,a10;int i,j,p,q,s,a10;int i,j,p,q,s,a10;int i,j,p,q,s,a10;printf(n input 10 numbers:n);printf(n input 10 numbers:n);printf(n input 10 numbers:n);printf(n input 10 numbers:n);for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)scanf(%d,&ai);scanf(%d,&ai);sc

17、anf(%d,&ai);scanf(%d,&ai);for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)p=i;q=ai;p=i;q=ai;p=i;q=ai;p=i;q=ai;for(j=i+1;j10;j+)for(j=i+1;j10;j+)for(j=i+1;j10;j+)for(j=i+1;j10;j+)if(q aj)p=j;q=aj;if(q aj)p=j;q=aj;if(q aj)p=j;q=aj;if(q aj)p=j;q=aj;if(i!=p)if(i!=p)if(i!=p)if(i!=p)s=ai;ai=ap

18、;ap=s;s=ai;ai=ap;ap=s;s=ai;ai=ap;ap=s;s=ai;ai=ap;ap=s;printf(%dt,ai);printf(%dt,ai);printf(%dt,ai);printf(%dt,ai);阅读程序,说明下列程序的功能阅读程序,说明下列程序的功能24第一部分:第一部分:#include stdio.hmain()int i,j,p,q,s,a10;printf(n input 10 numbers:n);for(i=0;i10;i+)scanf(%d,&ai);用于输入用于输入10个元素的初值。个元素的初值。25for(i=0;i10;i+)p=i;q=a

19、i;for(j=i+1;j10;j+)if(q aj)p=j;q=aj;if(i!=p)s=ai;ai=ap;ap=s;printf(%dt,ai);26 for(j=i+1;j10;j+)for(j=i+1;j10;j+)for(j=i+1;j10;j+)for(j=i+1;j10;j+)if(q aj)if(q aj)if(q aj)if(q aj)p=j;q=aj;p=j;q=aj;p=j;q=aj;p=j;q=aj;/*/*/*/*循循循循环环环环将将将将aiaiaiai与与与与ai+1,ai+1,ai+1,ai+1,ai+2,a9ai+2,a9ai+2,a9ai+2,a9相相相相比比

20、比比较较较较,找找找找出出出出其其其其中中中中最最最最大的数,大的数,大的数,大的数,*/*/*/*/27/如果如果ip,ai,apip,ai,ap互互换换 if(i if(i!=!=p)p)s=ai;s=ai;ai=ap;ai=ap;ap=s;ap=s;printf(%dt,ai);printf(%dt,ai);28#include#include#include#include stdio.hstdio.hstdio.hstdio.h main()main()main()main()int i,j,p,q,s,a10;int i,j,p,q,s,a10;int i,j,p,q,s,a10;

21、int i,j,p,q,s,a10;printf(printf(printf(printf(n input 10 numbers:n);n input 10 numbers:n);n input 10 numbers:n);n input 10 numbers:n);for(ifor(ifor(ifor(i=0;i10;i+)=0;i10;i+)=0;i10;i+)=0;i10;i+)scanf(scanf(scanf(scanf(%d,%d,%d,%d,&ai);&ai);&ai);&ai);for(i=0;i10;i+)for(i=0;i10;i+)for(i=0;i10;i+)for(i

22、=0;i10;i+)p=i;q=ai;p=i;q=ai;p=i;q=ai;p=i;q=ai;for(j=i+1;j10;j+)for(j=i+1;j10;j+)for(j=i+1;j10;j+)for(j=i+1;j10;j+)/*/*/*/*循循循循 环环环环 将将将将 aiaiaiai与与与与 ai+1,ai+1,ai+1,ai+1,ai+2,a9ai+2,a9ai+2,a9ai+2,a9相比相比相比相比较较较较,找出其中最大的数,找出其中最大的数,找出其中最大的数,找出其中最大的数,*/*/*/*/if(q aj)p=j;q=aj;if(q aj)p=j;q=aj;if(q aj)p=j

23、;q=aj;if(q aj)p=j;q=aj;if(i if(i if(i if(i!=!=!=!=p)p)p)p)/如果如果如果如果ip,ai,apip,ai,apip,ai,apip,ai,ap互互互互换换换换 s=ai;s=ai;s=ai;s=ai;ai=ap;ai=ap;ai=ap;ai=ap;ap=s;ap=s;ap=s;ap=s;printf(%dt,ai);printf(%dt,ai);printf(%dt,ai);printf(%dt,ai);7-27-2 二维数组的定义和引用二维数组的定义和引用 7.2.1 7.2.1二维数组的定义二维数组的定义二维数组定义的一般形式为二维数

24、组定义的一般形式为二维数组定义的一般形式为二维数组定义的一般形式为类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式;例如:例如:定义定义a a为为34(334(3行行4 4列列)的数组,的数组,b b为为510(5510(5行行1010列列)的数组。如下:的数组。如下:float afloat a3 34 4,b b5 51010;不能写成不能写成 float afloat a3 3,4 4,b b5 5,1010;注意注意我们可以把二维数组看作是一种特殊的一维数组:它我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。的元素又是一个一维数组。例如,

25、可以把例如,可以把a34看作是一个一维数组,它有看作是一个一维数组,它有3个个元素:元素:a0、a1、a2,每个元素又是一个,每个元素又是一个包含包含4个元素的一维数组。个元素的一维数组。7.2.1 7.2.1二维数组的定义二维数组的定义 二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素二二二二维数组在内存中的存放维数组在内存中的存放维数组在内存中的存放维数组在内存中的存放下图表示对下图表示对下图表示对下图表示对a a3 34 4数组存放的顺序数组存放的顺序数组存放的顺序数组存放的顺序 地址地址地址地址 值值值值 数组元素数组元素数组元素数组元素b

26、b0000b b0101b b0202b b1010b b1111b b1212b b2020b b2121b b22223003000 0H H3003002 2H H3003004 4H H3003006 6H H3003008 8H H300300A AH H300300C CH H300300E EH H30301010H H例如:整型数组例如:整型数组 b33=1,2,3,4,5,6,7,8,9;123456789问题:问题:问题:问题:有了二维数组的基础,那么有了二维数组的基础,那么有了二维数组的基础,那么有了二维数组的基础,那么多维数组多维数组如何定义呢?如何定义呢?定定义义三三

27、维维数数组组:float afloat a2 23 34 4;多多维维数数组组元元素素在在内内存存中中的的排排列列顺顺序序:第第一一维维的的下下标标变变化化最慢,最右最慢,最右边边的下的下标变标变化最快。化最快。7.2.1 7.2.1二维数组的定义二维数组的定义 a000a000a001a001a002a002a003a003 a010 a010a011a011a012a012a013a013 a020a020a021a021a022a022a023a023 a100 a100a101a101a102a102a103a103 a110 a110a111a111a112a112a113a113

28、a120 a120a121a121a122a122a123a123三三维维数数组组的的元元素素排排列列顺顺序序二维数组元素的表示形式为:二维数组元素的表示形式为:数组名下标下标数组名下标下标 例如:例如:a a2 23 3下标可以是整型表达式,下标可以是整型表达式,如如 a a2-12-12*2-12*2-1数组元素可以出现在表达式中,也可以被赋值,例如:数组元素可以出现在表达式中,也可以被赋值,例如:b b1 12 2=a=a2 23 3/2/2注意注意不要写成不要写成 a a2 2,3 3,a a2-12-1,2*2-12*2-1形式形式 7.2.2 7.2.2二维数组的引用二维数组的引用

29、常出现的错误有:常出现的错误有:int a34;/*/*定义定义a a为为3434的数组的数组*/*/a34=3;在使用数组元素时,应该注意下标值应在已定义在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。的数组大小的范围内。可以用下面可以用下面4 4种方法对二维数组初始化种方法对二维数组初始化数据类型数据类型 数组名数组名 常量表达式常量表达式1 1常量表达式常量表达式2 2 初始化数据初始化数据;(1)(1)分行给二维数组赋初值。分行给二维数组赋初值。如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(2)(2)可以将所有数据写在一个花括弧内,按数组

30、排列可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。的顺序对各元素赋初值。如:如:int aint a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;7.2.3 7.2.3二维数组的引用二维数组的引用(3)(3)可以对部分元素赋初值。可以对部分元素赋初值。如如 int a34=1,5,9;1 0 0 01 0 0 05 0 0 0 5 0 0 0 9 0 0 0也可以对各行中的某一元素赋初值,如int a34=1,0,6,0,0,11;1 0 0 01 0 0 00 6 0 00 6 0 00 0 0 0 1

31、10 0 11 1 0 0 01 0 0 05 6 0 0 5 6 0 0 0 0 0 0也可以只也可以只对对某几行元素某几行元素赋赋初初值值。如。如:int a34=1,5,6;(4)(4)如果对全部元素都赋初值,则定义数组时对第一维如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。的长度可以不指定,但第二维的长度不能省。如:如:int aint a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;它它等价等价于于:int aint a4 4=1=1,2 2,3 3,4 4,5 5,6 6,

32、7 7,8 8,9 9,1010,1111,12;12;在定义时也可以只对部分元素赋初值而省略第一维的在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:长度,但应分行赋初值。如:int aint a4 4=0=0,0 0,33,00,10;10;0030000001000 7.2.3 7.2.3二维数组的引用二维数组的引用 7.2.4 7.2.4二维数组程序举例二维数组程序举例 例例7.4 7.4 将一个二维数组行和列元素互换,存到另一个将一个二维数组行和列元素互换,存到另一个 二维数组中。二维数组中。#includevoidmain()inta23=1,2,3,4,5,

33、6;intb32,i,j;printf(arraya:n);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(%5d,aij);bji=aij;例如:a=1 2 3 1 4 4 5 6 b=2 5 3 6printf(n);printf(arrayb:n);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(%5d,bij);printf(n);/*程序结束*/运行结果如下:array a:1 2 3 4 5 6array b:1 4 2 536 字符数组字符数组 v 字字符符数数组组是是每每个个元元素素存存放放一一个个字字符符型型数数据据的数组。

34、的数组。v 字字符符数数组组的的定定义义形形式式和和元元素素的的引引用用方方法法与与一般数组相同一般数组相同。说明:说明:1.1.C C语言中没有专门的字符串变量,因此利语言中没有专门的字符串变量,因此利用字符型数组来处理字符串。用字符型数组来处理字符串。7-37-3 字符数组字符数组用来存放字符数据用来存放字符数据的数组是字符数组。的数组是字符数组。字符数组中的一个字符数组中的一个元素存放一个字符。元素存放一个字符。7.3.1 7.3.1字符数组的定义字符数组的定义定义方法与前面介绍的类似。例如:定义方法与前面介绍的类似。例如:char cchar c1010;c0=I;cc0=I;c1 1

35、=;c=;c2 2=a;=a;c c3 3=m;c=m;c4 4=;c5=h;c6=a;c5=h;c6=a;c c7 7=p;c=p;c8 8=p;c=p;c9 9=y;=y;对字符数组初始化,对字符数组初始化,最容易理解的方式是逐个字符最容易理解的方式是逐个字符赋给数组中各元素。如:赋给数组中各元素。如:char c10=I,a,m,,h,a,p,p,y;如果在定义字符数组时不进行初始化,则数组中各元如果在定义字符数组时不进行初始化,则数组中各元 素的值是不可预料的。素的值是不可预料的。如果花括弧中提供的初值个数如果花括弧中提供的初值个数(即字符个数即字符个数)大于数组大于数组长度,则按语法

36、错误处理。长度,则按语法错误处理。7.3.2 7.3.2字符数组的初始化字符数组的初始化如果初值个数小于数组长度,则只将这些字符赋给数如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符组中前面那些元素,其余的元素自动定为空字符(即即0)0)。例如:。例如:char cchar c1010=c=c,pp,rr,oo,gg,rr,aa,m;m;如果提供的初值个数与预定的数组长度相同,在定义如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:数组长度。例如:ch

37、ar cchar c=I,a,m,h,=I,a,m,h,a,p,p,y;a,p,p,y;数组数组c c的长度自动定为的长度自动定为1010。也可以定义和初始化一个二维字符数组。例如:也可以定义和初始化一个二维字符数组。例如:char diamond55=,*,*,*,*,*,*,*,*7.3.3 7.3.3字符数组的引用字符数组的引用例例7.6 输输出一个字符串。出一个字符串。程序如下:程序如下:#include#include void main()void main()char c11=I,a,m,a,char c11=I,a,m,a,b,o,y;,b,o,y;int i;int i;fo

38、r(i=0;i10;i+)for(i=0;i10;i+)printf(%c,ci);printf(%c,ci);printf(n);printf(n);运行结果:运行结果:I am a boy I am a boy 例例7.7 7.7 输出一个钻石图形输出一个钻石图形#include#include void main()void main()char char diamond5=diamond5=,*,*,*,*,*,*,*,*,*,*,*,*,*,*;,*,*;int int i,j;i,j;for for(i=0;i5;i+)(i=0;i5;i+)for for(j=0;j5;j+)(j

39、=0;j5;j+)printf printf(%c,diamondij);(%c,diamondij);printf printf(n);(n);运行结果运行结果 *7.3.3 7.3.3字符数组的引用字符数组的引用 7.3.4 7.3.4字符串和字符串结束标志字符串和字符串结束标志为了测定字符串的实际长度,C C语言规定了一个语言规定了一个“字符字符串结束标志串结束标志”,以字符,以字符00作为标志。作为标志。如果有一个字符串,前面9个字符都不是空字符(即0),而第10个字符是0,则此字符串的有效字符为9个。系统对字符串常量也自动加一个系统对字符串常量也自动加一个00作为结束符。作为结束符。

40、00代表代表ASCIIASCII码为码为0 0的字符,从的字符,从ASCIIASCII码表中可以码表中可以查到,查到,ASCIIASCII码为码为0 0的字符不是一个可以显示的字符,的字符不是一个可以显示的字符,而是一个而是一个“空操作符空操作符”,即它什么也不干。用它来作,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。符,只起一个供辨别的标志。可以用字符串常量来使字符数组初始化。例如charc=Iamhappy;也可以省略花括弧,直接写成charc=“Iamhappy;它与下面的数组初始化等价ch

41、ar c=I,a,m,h,a,p,p,y,00注意注意再比如 char cchar c1010=China;=China;数组c的前5个元素为C,h,i,n,a,第6个元素为0,后后4个元素也设定为空字个元素也设定为空字符。符。7.3.4 7.3.4字符串和字符串结束标志字符串和字符串结束标志3.3.字符串常量是用双引号包围的字符序列。字符串常量是用双引号包围的字符序列。如:如:“china”,“china”,作作为为字字符符串串的的结结束束标标志志的的0 0 可可 以不显式写出以不显式写出.2.2.C C语语言言中中约约定定用用0 0 作作为为字字符符串串的的结结束束标标志志,它它占占内内存

42、存空空间间,但但不不计计入入串串的的实实际长度。际长度。即即 “china”“china”“china“china 0 0”字符常量与字符串常量的区别字符常量与字符串常量的区别 字符常量字符常量 字符串常量字符串常量 单引号单引号 双引号双引号 1个字符个字符 多个字符多个字符字符变量字符变量 字符数组字符数组一个字节一个字节 字符串中字节数字符串中字节数+1 (0结束标志)结束标志)引用形式:引用形式:存放内容:存放内容:赋值对象:赋值对象:占用空间:占用空间:例如:例如:a “a”不同不同 1个字节个字节 2个字节个字节 53一、字符数组的初始化一、字符数组的初始化The空格空格空格空格注

43、意:注意:产产生生的的数数组组没没有有结结束束符符00。因因为为是是以以单单个个字字符符形形式式为为数数组组各各元元素素赋赋初初值值,所所以以数数组组ratrat中存放的不是字符串。中存放的不是字符串。char char rat5=T,h,e,rat5=T,h,e,;1 1、用字符型数据对字符数组初始化、用字符型数据对字符数组初始化54若若使使数数组组ratrat中中存存放放的的是是字字符符串串。应应加加入结束符入结束符00The空格空格 00 即:即:char char rat5=T,h,e,rat5=T,h,e,0;,0;552 2、用字符串常量对字符数组初始化、用字符串常量对字符数组初始

44、化 char panic6=HELLO;char panic6=HELLO;HELLO00注意:注意:数数组组中中的的字字符符除除了了H,E,L,L,OH,E,L,L,O之之外外,系系统统自自动动加加入结束标志入结束标志00。为为了了用用一一个个字字符符数数组组来来存存储储长长度度为为N N的的字字符符串串,要求字符数组的大小至少为要求字符数组的大小至少为N+1.N+1.56 初始化时也可省略花括号。初始化时也可省略花括号。char panic=HELLO;char panic=HELLO;HELLO00系系 统统 自自动加入动加入下面的初始化是错误的下面的初始化是错误的:char neg5=

45、double arrow;char neg5=double arrow;57对于一个二维数组,对于一个二维数组,C C编译程序将编译程序将其视为一个一维数组,这个一维数其视为一个一维数组,这个一维数组中每个元素又是一个一维数组。组中每个元素又是一个一维数组。这一概念对字符型数组仍适用。这一概念对字符型数组仍适用。3 3、二维字符数组的初始化、二维字符数组的初始化58aa0000bbb00c000000char chchar ch3 34 4=“aa”,”bbb”,”c”=“aa”,”bbb”,”c”;第一维的长度代表要存储的字符串的个第一维的长度代表要存储的字符串的个数,可以省略。数,可以省略

46、。第二维的长度不能省略,且应按最长的第二维的长度不能省略,且应按最长的字符串长度设定字符串长度设定59二、字符数组的输入输出二、字符数组的输入输出1、按、按C格式符一个字符一个字符地单独输入输出格式符一个字符一个字符地单独输入输出例:例:main()int i,str10;for(i=1;i10;i+)scanf(“%c”,&stri);for(i=1;i10;i+)printf(“%c”,stri);601.1.输入多个数据时,格式控制串中没有非格式字符,则输入输入多个数据时,格式控制串中没有非格式字符,则输入时数据间的分隔符可用空格、时数据间的分隔符可用空格、TAB键、回车键。键、回车键。

47、2.输入字符数据时,若格式控制符中无非格式符,则认为所有输入字符数据时,若格式控制符中无非格式符,则认为所有输入的字符均为有效字符。输入的字符均为有效字符。char a,b,c;scanf(%c%c%c,&a,&b,&c);printf(a=%c,b=%c,c=%c,a,b,c);输入:输入:A,B,C 输出:输出:a=A,b=,c=B 注:注:Scanf函数的函数的%c格式格式612、按、按S格式符将字符串作为一个整体输入输出格式符将字符串作为一个整体输入输出 用用scanf函数加函数加%s实现字符串输入实现字符串输入注意:注意:(1)输输入入的的字字符符串串中中不不能能有有空空格格、回回车

48、车或或跳跳格格符符(Tab),因为系统遇到这些分隔符时,会认为输入结束。因为系统遇到这些分隔符时,会认为输入结束。上上例例中中若若输输入入:hello world 则则实实际际存存入入str的的只只有有hello“例如:例如:char str10;scanf(%s,str);62 用用printf函数加函数加%s实现字符串输出实现字符串输出 printf(%s,str);(2)要要保保证证字字符符数数组组的的长长度度足足够够大大。Scanf()不不检检查查用用户户输输入入字字符符串串长长度度是是否否超超过过了了字字符符数数组组的容纳能力的容纳能力(3)数数组组名名前前不不用用加加&符符号号,因

49、因为为数数组组名名本本身身代表该数组的首地址。代表该数组的首地址。数组名数组名633、用字符串处理函数、用字符串处理函数 gets 或或 puts 输入输输入输出一个字符串出一个字符串 gets()函数函数专门用于输入字符串专门用于输入字符串 一般形式是一般形式是:gets(字符数组名字符数组名);其中:函数参数只能使用数组名而不其中:函数参数只能使用数组名而不能是字符串常量能是字符串常量64v 与与scanf函数的不同是:函数的不同是:gets()函函数数将将用用户户键键入入的的换换行行符符之之前前的的所所有有字字符符 (包包括括t和和)存存入入字字符符数数组组,然然后后加加上上0,但但换换

50、行符被丢掉行符被丢掉 v 与与scanf函数相同的是:函数相同的是:gets()函函数数也也不不检检查查用用户户输输入入字字符符串串长长度度是是否否超超过过了了字字符符数数组组的的容容纳纳能能力力,因因此此编编程程者者要要确确保保数数组组足够大。足够大。vscanf()不能读入带空格的字符串,不能读入带空格的字符串,gets()可以可以gets()函数函数65#include#define LATH 80main()char nameLATH;printf(你好你好,请输入姓名请输入姓名:n);gets(name);printf(真是个好名字真是个好名字:%sn,name);例例:66其其中中

展开阅读全文
相关资源
相关搜索

当前位置:首页 > pptx模板 > 企业培训

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁