《c语言教学资料》4数组.ppt
第第4章章 数数组和字符串和字符串2第第4 4章章 数组数组4.1 一维数组一维数组 4.2 二维数组二维数组 4.3 字符数组字符数组 4.4 数组元素的查找和排序数组元素的查找和排序 本章内容本章内容3第第4 4章章 数组数组v前面所讲的分散的变量对处理大量的有组织的数前面所讲的分散的变量对处理大量的有组织的数据(如:多个学生多门课的成绩处理)就显得无据(如:多个学生多门课的成绩处理)就显得无能为力,需要一种有组织的变量的集合来处理这能为力,需要一种有组织的变量的集合来处理这类问题。类问题。v这个集合需要用一个统一的名称来命名,而集合这个集合需要用一个统一的名称来命名,而集合中的每一个元素需要用序号来唯一地确定。并且中的每一个元素需要用序号来唯一地确定。并且集合中的每一个元素都属于同一种数据类型。集合中的每一个元素都属于同一种数据类型。v这种变量的集合就是数组。这种变量的集合就是数组。v数组类型是构造类型数据的一种。构造类型数据数组类型是构造类型数据的一种。构造类型数据是由一些基本类型数据按照一定的规则组成。是由一些基本类型数据按照一定的规则组成。4第第4 4章章 数组数组v数组的基本概念:数组的基本概念:v所谓所谓数组数组,是若干个相同类型数据元素的有序集,是若干个相同类型数据元素的有序集合。所起的名字称为合。所起的名字称为数组名。数组名。例如:例如:int jsj30;int jsj30;v用对应的序号来区分这个集合中的一个个元素。用对应的序号来区分这个集合中的一个个元素。序号称为数组元素的序号称为数组元素的下标。下标。例如:例如:sjs0,jsj1,jsj2jsj29sjs0,jsj1,jsj2jsj29v用一个下标来区分其元素的数组,称为用一个下标来区分其元素的数组,称为一维数组一维数组;用两个或多个下标来区分其元素的数组,称为用两个或多个下标来区分其元素的数组,称为二二维数组维数组(例如:(例如:a23a23)或)或多维数组多维数组(例如:(例如:a233a233)。)。5 4.1 4.1 一维数组一维数组本节内容本节内容 4.1.2 一维数组的初始化一维数组的初始化 4.1.3 一维数组元素的引用一维数组元素的引用 4.1.4 一维数组的应用举例一维数组的应用举例 4.1.1 一维数组的定义一维数组的定义64.1 4.1 一维数组一维数组v只有一个下标的数组叫做只有一个下标的数组叫做一维数组一维数组。例如:例如:sum3sum3v数组是一组变量,这组变量具有相同的名字,相数组是一组变量,这组变量具有相同的名字,相同的数据类型,并且在存储器中连续存放。同的数据类型,并且在存储器中连续存放。例如:数组例如:数组sum3sum3中包含中包含sum0sum0、sum1sum1、sum2sum2。v每一个变量称为数组的一个每一个变量称为数组的一个“数组单元数组单元”。v保存在其中的数据值称为保存在其中的数据值称为“数组元素数组元素”。v用用“下标变量下标变量”来标识来标识区分数组中的各数组元区分数组中的各数组元素。素。74.1.1 4.1.1 一维数组的定义一维数组的定义v一维数组的定义方式为:一维数组的定义方式为:类型说明符类型说明符 数组名数组名 常量表达式常量表达式;v例如:例如:int a6int a6;v如图,编译时分配连续内存单元。如图,编译时分配连续内存单元。a00145a1a2a3a4a523a84.1.1 4.1.1 一维数组的定义一维数组的定义v注意事项:注意事项:int a10;int a10;数组名的命名遵循标识符命名规则。数组名的命名遵循标识符命名规则。类型说明符说明该数组中数组元素的数据类型。类型说明符说明该数组中数组元素的数据类型。数组名后是用方括号括起来的常量表达式。数组名后是用方括号括起来的常量表达式。方括号中的常量表达式表示数组中元素的个数。方括号中的常量表达式表示数组中元素的个数。C C语言规定数组元素的下标从语言规定数组元素的下标从0 0开始,因此在数组开始,因此在数组a a中中的的1010个元素,分别为个元素,分别为a0a0a9a9,不存在,不存在a10a10 。定义数组时定义数组时,方括号中的常量表达式可以是常量或者,方括号中的常量表达式可以是常量或者符号常量,但不能包含变量。符号常量,但不能包含变量。例如:例如:int ax;int ax;是不可是不可以的。以的。94.1.2 4.1.2 一维数组的初始化一维数组的初始化v数组的初始化数组的初始化即为数组元素赋初始值即为数组元素赋初始值 v先定义数组,然后用赋值语句为数组元素赋初值。先定义数组,然后用赋值语句为数组元素赋初值。int a10int a10;a0=0a0=0;a1=1a1=1;a2=2a2=2;v在定义数组时对数组全部元素赋初值。在定义数组时对数组全部元素赋初值。例如:例如:int a10=0int a10=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,99;v在定义数组时对数组中一部分元素赋值。在定义数组时对数组中一部分元素赋值。例如:例如:int a10=0 int a10=0,1 1,2 2,3 3,44;(未赋值元素为;(未赋值元素为0 0)v在定义数组时给数组全部元素赋值为在定义数组时给数组全部元素赋值为0 0。int a10=0int a10=0;v为全部数组元素赋初值时,可不指定数组长度。为全部数组元素赋初值时,可不指定数组长度。int a=0int a=0,1 1,2 2,3 3,44;104.1.3 4.1.3 一维数组元素的引用一维数组元素的引用v数组元素引用的一般形式为:数组元素引用的一般形式为:v数组名数组名 下标下标 v引用数组元素的几点说明:引用数组元素的几点说明:下标可以是整型常量或整型表达式(可以是变量)。下标可以是整型常量或整型表达式(可以是变量)。a0=ax+a2*a3-a5-2 a0=ax+a2*a3-a5-2 (x x为整型且有值)为整型且有值)C C语言中数组元素的下标从语言中数组元素的下标从0 0开始,并且数组元素的下开始,并且数组元素的下标一定要小于数组的长度。标一定要小于数组的长度。只能逐个引用数组元素,而不能一次引用整个数组。只能逐个引用数组元素,而不能一次引用整个数组。只能:只能:printf(“%d”,a0);printf(“%d”,a0);不能:不能:printf(“%d”,a);printf(“%d”,a);v C C语言规定:语言规定:数组名是分配给该数组的存储区的首数组名是分配给该数组的存储区的首地址,即数组第一个元素存放的地址地址,即数组第一个元素存放的地址。114.1.3 4.1.3 一维数组元素的引用一维数组元素的引用inta10;inti,max,min;printf(Pleaseinput:);for(i=0;i10;i+)scanf(%d,&ai);max=a0;min=a0;for(i=1;imax)max=ai;elseif(aimin)min=ai;printf(max=%d;min=%d,max,min);【例例4-1】从键盘从键盘输入输入10个同学的计个同学的计算机基础课成绩算机基础课成绩(整型);输出最(整型);输出最高成绩和最低成绩。高成绩和最低成绩。12【例例4-2】一个歌唱比赛,共有一个歌唱比赛,共有10名评委,他们分别给一位名评委,他们分别给一位歌手打分。分数采用百分制。选手最后的得分是用这样的歌手打分。分数采用百分制。选手最后的得分是用这样的方法计算出来的:从方法计算出来的:从10名评委的评分中扣除一个最高分,名评委的评分中扣除一个最高分,扣除一个最低分,然后统计其总分,并除以扣除一个最低分,然后统计其总分,并除以8,最后得到这,最后得到这个歌手的最后得分。个歌手的最后得分。4.1.4 4.1.4 一维数组的应用举例一维数组的应用举例#includemain()intscore10;/10个评委的评分floatmark;/记录最后得分inti;intmax=-1;/最高分intmin=101/最低分intsum=0;/10个评委评分的总和for(i=0;i10;i+)/输入10个分数printf(PleaseEntertheScoreofNo.%d:,i+1);scanf(%d,&scorei);sum=sum+scorei;134.1.4 4.1.4 一维数组的应用举例一维数组的应用举例for(i=0;imax)max=scorei;for(i=0;i10;i+)/遍历数组,找最低分if(scoreimin)min=scorei;mark=(sum-max-min)/8.0;/求平均printf(Themarkofthissingeris%4.2fn,mark);144.1.4 4.1.4 一维数组的应用举例一维数组的应用举例154.1.4 4.1.4 一维数组的应用举例一维数组的应用举例v【例【例4-34-3】利用数组计算】利用数组计算FibonacciFibonacci数列的前数列的前1010个个数数,并按每行打印并按每行打印5 5个数的格式输出。个数的格式输出。v其中:其中:FibonacciFibonacci数列计算公式如下:数列计算公式如下:F1=1 F1=1,F2=1F2=1,F3=F1+F2F3=F1+F2,Fn=Fn-2+Fn-1Fn=Fn-2+Fn-1。#includevoidmain()inti;intf10=1,1;/用数组存储Fibonacci数列,并赋初值/f0=1,f1=1,f2=f3=f9=0for(i=2;i10;i+)/为f2f9按计算公式重新赋值fi=fi-2+fi-1;164.1.4 4.1.4 一维数组的应用举例一维数组的应用举例for(i=0;i10;i+)/输出10个Fibonacci数printf(%dt,fi);if(i+1)%5=0)/i+1为当前输出的Fibonacci数的序号printf(n);/每输出五个数换行17 4.2 4.2 二维数组二维数组本节内容本节内容 4.2.2 二维数组的初始化二维数组的初始化 4.2.3 二维数组元素的引用二维数组元素的引用 4.2.4 二维数组的应用举例二维数组的应用举例 4.2.1 二维数组的定义二维数组的定义184.2.1 4.2.1 二维数组的定义二维数组的定义v二维数组定义的一般形式为:二维数组定义的一般形式为:类型说明符类型说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22;v例如,例如,“int a23;int a23;”v(注意,不能写成(注意,不能写成“int int a2,3a2,3;”;”)v定义了数组定义了数组a a。数组。数组a a为为2 2行行3 3列的整型数组,即数组元列的整型数组,即数组元素为素为:a00,a01,a02a00,a01,a02a10,a11,a12a10,a11,a12194.2.1 4.2.1 二维数组的定义二维数组的定义v二维数组可以看作是由一维数组嵌套构成的。二维数组可以看作是由一维数组嵌套构成的。v我们可以把二维数组看作是一种特殊的一维数我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。组:它的元素又是一个一维数组。v例如,可以把数组例如,可以把数组a a看作一个一维数组,它有两看作一个一维数组,它有两个元素:个元素:a0a0、a1a1,每一个元素又是一个包,每一个元素又是一个包含含3 3个元素的一维数组。个元素的一维数组。a0a0 a00a00a01a01a02a02a1a1 a10a10a11a11a12a12204.2.2 4.2.2 二维数组的初始化二维数组的初始化v按行分段整体初始化。按行分段整体初始化。int a34=1,4,6,6,4,6,7,1,8,4,1,0;int a34=1,4,6,6,4,6,7,1,8,4,1,0;v按行连续整体初始化。按行连续整体初始化。int a34=1,4,6,6,4,6,7,1,8,4,1,0;int a34=1,4,6,6,4,6,7,1,8,4,1,0;v按行分段部分初始化。按行分段部分初始化。int a34=5,7,1,8,5,2,5,6;int a34=5,7,1,8,5,2,5,6;v按行连续部分初始化。按行连续部分初始化。int a34=2,5,8,6,2,4,7,2,1;int a34=2,5,8,6,2,4,7,2,1;v如果提供全部的初始值,在定义时可不指明第如果提供全部的初始值,在定义时可不指明第一维的长度。一维的长度。int4=4,5,0,1,3,5,7,6,1,0,2,3;int4=4,5,0,1,3,5,7,6,1,0,2,3;214.2.3 4.2.3 二维数组元素的引用二维数组元素的引用v二维数组元素的表示形式为:二维数组元素的表示形式为:数组名数组名 下标下标11下标下标22v下标可以是整型常量或整型表达式。下标可以是整型常量或整型表达式。v定义时,定义时,a34a34中的中的3 3和和4 4各维的大小各维的大小。v引用时,引用时,a23a23中的中的2 2和和3 3是下标值是下标值。v如果定义数组:如果定义数组:int a34int a34;那么引用;那么引用a34a34是错误的,因为数组的下标是从是错误的,因为数组的下标是从0 0开始,数组开始,数组a a的的下标下标1 1的范围是的范围是0 02 2,下标,下标2 2的范围是的范围是0 03 3。数组数组中不存在中不存在a34a34这个元素!这个元素!224.2.3 4.2.3 二维数组元素的引用二维数组元素的引用v【例【例4-54-5】输入一个】输入一个3333的矩阵,求该矩阵的转置的矩阵,求该矩阵的转置矩阵(行列互换),并输出这两个矩阵。例如矩矩阵(行列互换),并输出这两个矩阵。例如矩阵阵A A的转置矩阵为矩阵的转置矩阵为矩阵B B:234.2.4 4.2.4 二维数组的应用举例二维数组的应用举例#include#defineN3main()inti,j,n;intaNN,bNN;printf(pleaseinput:n);for(i=0;i=N-1;i+)/循环输入for(j=0;j=N-1;j+)printf(a%d%d:,i,j);scanf(%d,&aij);for(i=0;i=N-1;i+)/a行列互换得到转置矩阵存入bfor(j=0;j=N-1;j+)bij=aji;244.2.4 4.2.4 二维数组的应用举例二维数组的应用举例for(i=0;i=N-1;i+)/输出两个矩阵for(j=0;j=N-1;j+)/输出数组a的第i+1行printf(%2d,aij);printf(t);/矩阵的间隔for(j=0;j=N-1;j+)/出数组b的第i+1行printf(%2d,bij);printf(n);254.2.4 4.2.4 二维数组的应用举例二维数组的应用举例26 4.3 4.3 字符数组字符数组本节内容本节内容 4.3.2 字符串与字符数组字符串与字符数组 4.3.3 字符数组的初始化字符数组的初始化 4.3.4 字符数组的引用字符数组的引用 4.3.1 字符数组的定义字符数组的定义27 4.3 4.3 字符数组字符数组本节内容本节内容 4.3.6 常用字符串处理函数常用字符串处理函数 4.3.7 综合应用举例综合应用举例 4.3.5 字符数组的应用举例字符数组的应用举例284.3.1 4.3.1 字符数组的定义字符数组的定义v用来存放字符数据的数组是用来存放字符数据的数组是字符数组字符数组,字符数组,字符数组中的一个数组元素存放一个字符。中的一个数组元素存放一个字符。v字符数组的定义一般形式如下:字符数组的定义一般形式如下:char char 数组名数组名 常量表达式常量表达式 v例如例如“char c10;”char c10;”定义了一个一维字符数组定义了一个一维字符数组c c,它的长度为,它的长度为1010,可以存放,可以存放1010个字符或一个长度个字符或一个长度不大于不大于9 9的字符串。的字符串。v又如又如“char c35;”char c35;”定义了一个二维字符数组定义了一个二维字符数组c c,它可以存放,它可以存放1515个字符或个字符或3 3个长度不大于个长度不大于4 4的字符的字符串。串。294.3.2 4.3.2 字符串与字符数组字符串与字符数组vC C语言中有字符串常量,却没有字符串变量,通语言中有字符串常量,却没有字符串变量,通常用字符数组来存放字符串。常用字符数组来存放字符串。v字符串是以字符串是以00作为结束符的字符序列作为结束符的字符序列。v当一个字符串存入字符数组时,当一个字符串存入字符数组时,C C编译系统会自编译系统会自动将结束符动将结束符00存入数组,以此作为该字符串存入数组,以此作为该字符串结束的标志,这要比用字符逐个的给字符数组赋结束的标志,这要比用字符逐个的给字符数组赋值多占一个字节来存放字符串结束标志值多占一个字节来存放字符串结束标志00。如:如:char c8=Li Chen;char c8=Li Chen;L Li i C Ch he en n00304.3.2 4.3.2 字符串与字符数组字符串与字符数组v采用采用00标志作为字符串的结束标志后,在用标志作为字符串的结束标志后,在用字符串赋初值时无需指定数组的长度,可以由编字符串赋初值时无需指定数组的长度,可以由编译系统自动处理。译系统自动处理。如:如:char c=Li Chen;char c=Li Chen;在内存中占在内存中占8 8个字节,分别存储个字节,分别存储L,i,L,i,C,h,e,nC,h,e,n和和00。v字符串常量字符串常量“Li ChenLi Chen”,”,代表字符串所在内存的代表字符串所在内存的首地址,而不是字符串序列本身首地址,而不是字符串序列本身,所以只能在定义所以只能在定义数组时用字符串常量初始化,不能给已经定义好数组时用字符串常量初始化,不能给已经定义好的数组赋字符串常量。的数组赋字符串常量。如不能:如不能:char c10;char c10;c10=c10=Li Chen;Li Chen;314.3.3 4.3.3 字符数组的初始化字符数组的初始化v对字符数组初始化,最容易理解的方式是用字对字符数组初始化,最容易理解的方式是用字符常量初始化字符数组。如:符常量初始化字符数组。如:char c110=I,a,m,h,a,char c110=I,a,m,h,a,p,p,y;p,p,y;v用字符串常量初始化字符数组。如:用字符串常量初始化字符数组。如:char c4=I am happy;char c4=I am happy;char c511=I am happy;char c511=I am happy;v总之,对字符数组初始化可以有以下几种形式:总之,对字符数组初始化可以有以下几种形式:char c68=Li Chen;char c68=Li Chen;char c7=Li Chen;char c7=Li Chen;char c8=L,i,C,h,e,nchar c8=L,i,C,h,e,n;324.3.3 4.3.3 字符数组的初始化字符数组的初始化v区分区分00与与000=0逻辑逻辑假假0=48逻辑逻辑真真0与与0334.3.3 4.3.3 字符数组的初始化字符数组的初始化v区分区分AA与与AAAA1.1.占占1 1个字节个字节;2.2.是数值是数值;3.3.格式符格式符%c c;4.4.赋值方式:赋值方式:char ch;char ch;ch ch=A;A;或或char ch=char ch=A;A;1.1.占占2 2个字节个字节;2.2.是地址是地址;3.3.格式符格式符%s s;4.4.赋值方式:赋值方式:char schar s2;2;strcpystrcpy(s,A)(s,A);或或char char s s22=A;=A;344.3.4 4.3.4 字符数组的引用字符数组的引用v字符数组的引用和前边介绍过的数组的引用是一字符数组的引用和前边介绍过的数组的引用是一样的,只不过引用字符数组中的一个元素,我们样的,只不过引用字符数组中的一个元素,我们得到的是一个字符。得到的是一个字符。char c=Li Chen;char c=Li Chen;char f=c3;char f=c3;vf f的内容为的内容为:C:C354.3.5 4.3.5 字符数组的应用举例字符数组的应用举例#includemain()charc10=I,a,m,a,b,o,y;inti;for(i=0;i10;i+)printf(%c,ci);printf(n);【例例4-6】输出一个字符数组。输出一个字符数组。364.3.5 4.3.5 字符数组的应用举例字符数组的应用举例#includemain()chardiamond5=,*,*,*,*,*,*,*,*;inti,j;for(i=0;i5;i+)for(j=0;j5;j+)printf(%c,diamondij);printf(n);【例例4-7】输出一个菱形图输出一个菱形图。374.3.5 4.3.5 字符数组的应用举例字符数组的应用举例v可以用可以用printf()printf()函数和函数和scanf()scanf()函数一次性输入函数一次性输入输出一个字符串,而不必使用循环语句逐个地输输出一个字符串,而不必使用循环语句逐个地输入输出每个字符。入输出每个字符。【例例4-94-9】从键盘输入字符串从键盘输入字符串“program”program”,然后将其输,然后将其输出。出。#includemain()charc10;scanf(%s,c);printf(%sn,c);384.3.5 4.3.5 字符数组的应用举例字符数组的应用举例#includemain()charnum4,name20,sex=male;inti;printf(PleaseinputNum:);for(i=0;i4;i+)scanf(%c,&numi);printf(PleaseinputName:);scanf(%s,name);printf(Num:%snName:%snSex:%sn,num,name,sex);【例例4-10】多种方式为字符串赋值。多种方式为字符串赋值。394.3.5 4.3.5 字符数组的应用举例字符数组的应用举例404.3.6 4.3.6 常用字符串处理函数常用字符串处理函数vC C语言标准库提供了丰富的字符串处理的函数,大语言标准库提供了丰富的字符串处理的函数,大致可分为致可分为字符串基本处理函数字符串基本处理函数和和字符串与数值数字符串与数值数据的转换函数据的转换函数两类。两类。v字符串基本处理函数包含在头文件字符串基本处理函数包含在头文件string.hstring.h中,中,字符串与数值数据的转换函数包含在头文件字符串与数值数据的转换函数包含在头文件stdlib.hstdlib.h中。中。v使用这类函数可以大大减轻编程量。使用这类函数可以大大减轻编程量。v下面介绍几个最常用的字符串函数。下面介绍几个最常用的字符串函数。414.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.1 gets()4.3.6.1 gets()函数函数v格式:格式:vchar*gets(char*string)char*gets(char*string)v功能:从键盘中输入一个字符串放入参数指定的功能:从键盘中输入一个字符串放入参数指定的数组中。数组中。其函数值是字符数组的起始地址。其函数值是字符数组的起始地址。v通常我们不关心函数值,只利用它的输入功能。通常我们不关心函数值,只利用它的输入功能。所以,其格式可以写成如下形式:所以,其格式可以写成如下形式:vgets(gets(字符数组字符数组)424.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.2 puts()4.3.6.2 puts()函数函数v格式:格式:vint(char*string)int(char*string)v功能:输出以空字符功能:输出以空字符00终结的字符串到标准终结的字符串到标准输出设备(显示器)。函数取值是字符串长度。输出设备(显示器)。函数取值是字符串长度。v通常我们不关心函数值,只利用它的输出功能。通常我们不关心函数值,只利用它的输出功能。所以,其格式可以写成如下形式:所以,其格式可以写成如下形式:vputs(puts(字符数组字符数组)434.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#includeintmain(void)charstring80;printf(Inputastring:);gets(string);printf(Thestringinputwas:);puts(string);return0;【例例4-11】分析分析下列程序的结果,下列程序的结果,注意字符串输入注意字符串输入输出函数的用法。输出函数的用法。444.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v如果用如果用scanfscanf函数输入字符串时,空白符用于分隔函数输入字符串时,空白符用于分隔字符串,所以输入的字符串中不能包含空格。字符串,所以输入的字符串中不能包含空格。v如果用如果用getsgets函数输入字符串,当输入的字符串中函数输入字符串,当输入的字符串中含有空格时,空格是字符串中的有效字符,输出含有空格时,空格是字符串中的有效字符,输出中包含空格。表示中包含空格。表示getsgets函数并不以空格作为字符函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束,串输入结束的标志,而只以回车作为输入结束,并把回车转换为并把回车转换为00。v建议用建议用getsgets函数输入字符串。函数输入字符串。454.3.6 4.3.6 常用字符串处理函数常用字符串处理函数vgets()gets()函数函数 和和scanfscanf()函数的区别()函数的区别getsgets()()scanf()scanf()输入的字符串中输入的字符串中可包含空格可包含空格输入的字符串中输入的字符串中不可包含空格不可包含空格只能输入只能输入一个字符串一个字符串可连续输入可连续输入多个字符串多个字符串不可限定字符串的长度不可限定字符串的长度可限定字符串的长度可限定字符串的长度遇到遇到回车符回车符结束结束遇到遇到空格符或回车符空格符或回车符结束结束464.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.3 strcat()4.3.6.3 strcat()函数函数v格式:格式:vstrcat(strcat(字符数组名字符数组名1 1,字符数组名,字符数组名2);2);v功能:字符串连接函数,把字符数组功能:字符串连接函数,把字符数组2 2中的字符串中的字符串连接到字符数组连接到字符数组1 1中字符串的后面,并删去字符串中字符串的后面,并删去字符串1 1后的串标志后的串标志00。v要注意的是,字符数组要注意的是,字符数组1 1应定义足够的长度,否则应定义足够的长度,否则不能全部装入被连接的字符串。不能全部装入被连接的字符串。v本函数返回值是字符数组本函数返回值是字符数组1 1的首地址。的首地址。474.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()staticcharst130=Mynameis;charst210;printf(inputyourname:n);gets(st2);strcat(st1,st2);puts(st1);【例例4-12】分析下列分析下列程序的输出结果。程序的输出结果。484.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.4 strcpy()4.3.6.4 strcpy()函数函数v格式:格式:vstrcpy(strcpy(字符数组名字符数组名1 1,字符数组名,字符数组名2);2);v功能:把字符数组功能:把字符数组2 2中的字符串拷贝到字符数组中的字符串拷贝到字符数组1 1中。中。串结束标志串结束标志00也一同拷贝。也一同拷贝。v字符数组名字符数组名2 2,也可以是一个字符串常量。这时相当,也可以是一个字符串常量。这时相当于把一个字符串赋给一个字符数组。于把一个字符串赋给一个字符数组。v前面讲过,字符串常量是个地址,不能直接赋给一前面讲过,字符串常量是个地址,不能直接赋给一个字符数组。个字符数组。要给一个字符数组赋一个字符串常量要给一个字符数组赋一个字符串常量只能用只能用strcpy()strcpy()函数。函数。494.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()staticcharst115,st2=CLanguage;strcpy(st1,st2);/或:strcpy(st1,CLanguage);puts(st1);printf(n);【例例4-13】分分析下列程序的析下列程序的输出结果。输出结果。504.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.5 strcmp()4.3.6.5 strcmp()函数函数v格式:格式:vstrcmp(strcmp(字符数组名字符数组名1 1,字符数组名,字符数组名2);2);v功能:字符串比较函数,按照功能:字符串比较函数,按照ASCIIASCII码逐位比较两码逐位比较两个数组中字符串的对应位,并由函数返回值返回个数组中字符串的对应位,并由函数返回值返回比较结果。比较结果。字符串字符串1 1字符串字符串2 2,返回值,返回值0 0;字符串字符串11字符串字符串2 2,返回值,返回值00;字符串字符串11字符串字符串2 2,返回值,返回值00。本函数也可用于比较两个字符串常量,或比较数组和字本函数也可用于比较两个字符串常量,或比较数组和字符串常量。符串常量。514.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()intk;staticcharst115,st2=CLanguage;printf(inputastring:n);gets(st1);k=strcmp(st1,st2);if(k=0)printf(st1=st2n);if(k0)printf(st1st2n);if(k0)printf(st1st2n);【例例4-14】分析分析下列程序的输出下列程序的输出结果。结果。524.3.6 4.3.6 常用字符串处理函数常用字符串处理函数v4.3.6.6 strlen()4.3.6.6 strlen()函数函数v格式:格式:vstrlen(strlen(字符数组名字符数组名););v功能:测字符串长度函数,测字符串的实际长度功能:测字符串长度函数,测字符串的实际长度(不含字符串结束标志不含字符串结束标志0)0)并作为函数返回值。并作为函数返回值。534.3.6 4.3.6 常用字符串处理函数常用字符串处理函数#include#includestring.hmain()intk;staticcharst=Clanguage;k=strlen(st);printf(Thelenthofthestringis%dn,k);【例例4-15】分分析下列程序的析下列程序的输出结果。输出结果。544.3.7 4.3.7 综合应用举例综合应用举例#defineN100#includemain()chari,len;charstringN,c;printf(pleaseinputastring:n);gets(string);printf(pleaseinputachar:n);scanf(%c,&c);for(i=0;stringi!=0;i+)/计算字符串中字符的个数;/循环体为空len=i;【例例4-16】在一个字符串中查找在一个字符串中查找指定字符,并输出该字符在字符指定字符,并输出该字符在字符串中第一次出现的位置。串中第一次出现的位置。554.3.7 4.3.7 综合应用举例综合应用举例for(i=0;stringi!=0;i+)/在字符串中查找变量c中所存字符if(stringi=c)break;/若找到,则退出循环if(i+1=len)printf(found%dn,i+1);/i从0开始若找到则字符的位置应为i+1elseprintf(notfoundn);564.3.7 4.3.7 综合应用举例综合应用举例#include#includemain()charpassword=tcass;charp80;inttime=0;doprintf(Enterpassword:);gets(p);if(strcmp(p,password)=0)printf(OK!welcomen);break;elsetime+;while(time3);【例例4-17】为了保为了保证计算机系统的安证计算机系统的安全,往往要在计算全,往往要在计算机上设置口令(密机上设置口令(密码),以杜绝非法码),以杜绝非法用户使用。以下给用户使用。以下给出一个用出一个用C语言编语言编制的密码程序。制的密码程序。574.3.7 4.3.7 综合应用举例综合应用举例if(time=3)printf(Youareillegalusern);58 4.4 4.4 数组元素的查找和排序数组元素的查找和排序本节内容本节内容 4.4.2 数组元素的排序数组元素的排序 4.4.1 字符元素的查找字符元素的查找594.4.1 4.4.1 字符元素的查找字符元素的查找#includevoidmain()inta10;inti,max,min;printf(Pleaseinput:);for(i=0;i10;i+)/输入10个数存入数组ascanf(%d,&ai);max=a0;min=a0;/假定最大最小值均是a0for(i=1;imax)max=ai;/若aimax,则修改max的值elseif(aimin)min=ai;/若aia1a0a1,则交换;然后比较第,则交换;然后比较第2 2个数与个数与第第3 3个数;依次类推,直至第个数;依次类推,直至第n-1n-1个数和第个数和第n n个数比个数比较为止。结果最大的数被安置在最后一个元素位较为止。结果最大的数被安置在最后一个元素位置上。置上。v2.2.第二趟冒泡排序:对前第二趟冒泡排序:对前n-1n-1个数进行冒泡排序,个数进行冒泡排序,结果使次大的数被安置在第结果使次大的数被安置在第n-1n-1个元素位置。个元素位置。v3.3.重复上述过程,经过重复上述过程,经过n-1n-1趟冒泡排序后结束。趟冒泡排序后结束。v4.4.在第在第j j趟比较中,要进行趟比较中,要进行n-jn-j次两两比较。次两两比较。624.4.2 4.4.2 数组元素的排序数组元素的排序38 49 65 76 13 27 30 第第二二趟趟38 49 65 13 27 30 第第三三趟趟38 49 13 27 30 第第四四趟趟38 13 27 30 第第五五趟趟13 27 30 第第六六趟趟13 27 第第七七趟趟49 38 65 97 76 13 27 30 第第一一趟趟3849769713972797309713767676273013652765306513134949304927382738303813 每趟结束时,不仅能挤出一每趟结束时,不仅能挤出一个最大值到最后面位置,还个最大值到最后面位置,还能同时部分理顺其它元素;能同时部分理顺其它元素;634.4.2 4.4.2 数组元素的排序数组元素的排序for(i=0;iN;i+)输入输入ai for(j=1;jN;j+)for(i=0;iai+1 T F ai与与ai+1交换交换输出输出a0aN