1、第第5章章 数组数组5.1 数组的概念数组的概念n为什么引入数组?为什么引入数组?n例如:一个班有例如:一个班有5050名学生,这名学生,这5050名学生的成绩都是名学生的成绩都是数值型的数据。要对这数值型的数据。要对这5050名学生的成绩进行处理名学生的成绩进行处理,变量如何定义?变量如何定义?解决方法一:定义解决方法一:定义5050个个s1s1、s2s2、s3s3这样的变量这样的变量解决方法二:解决方法二:n我们可以把这些具有相同性质的数据组合在一起,我们可以把这些具有相同性质的数据组合在一起,作为一个整体参加运算,称为数组,用一个统一的作为一个整体参加运算,称为数组,用一个统一的名字如名
2、字如s s来代表来代表5050个数据,个数据,s s称为数组名。称为数组名。n数组中的每个数据称为数组元素。数组元素用数组中的每个数据称为数组元素。数组元素用数组数组名名和和元素在数组中的序号元素在数组中的序号来确定,这个序号就是数来确定,这个序号就是数组元素组元素下标下标。如用如用s0s0代表第代表第1 1个数据(第个数据(第1 1个学生个学生的成绩),的成绩),s1s1代表第代表第2 2个数据(第个数据(第2 2个学生的成个学生的成绩)。绩)。不现实不现实n引入数组就不需要在程序中定义大量的变量,引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而大大减少程序中
3、变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数且数组含义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟据间的联系。许多好的算法都与数组有关。熟练地利用数组,可以大大提高编程和解题的效练地利用数组,可以大大提高编程和解题的效率。率。n数组是有序数据的集合数组是有序数据的集合,包括以下几个含义:,包括以下几个含义:n一个数组是由若干个数据组成的;一个数组是由若干个数据组成的;n这些数据是有次序的,用下标代表其次序;这些数据是有次序的,用下标代表其次序;n用一个统一的名字来代表这批数据,这就是数组名。用一个统一的名字来代表这批数据,这就是数组名。n要寻找一
4、个数组中的某一个元素必须给出两个要寻找一个数组中的某一个元素必须给出两个要素:数组名和下标。数组名和下标唯一地标要素:数组名和下标。数组名和下标唯一地标识一个数组中的元素。识一个数组中的元素。数组的存储数组的存储n数组是有类型属性的。同一数组中的每一个元素数组是有类型属性的。同一数组中的每一个元素都必须属于同一数据类型。一个数组在内存中占都必须属于同一数据类型。一个数组在内存中占一片连续的存储单元。如果有一个整型数组一片连续的存储单元。如果有一个整型数组a,假设数组的起始地址为假设数组的起始地址为2000,则该数组在内存,则该数组在内存中的存储情况如图中的存储情况如图5.1所示。所示。a0a1
5、a2a3a420002004200820122016.5.2 一维数组的定义和引用一维数组的定义和引用5.2.1 定义一维数组定义一维数组n格式格式:类型标识符类型标识符 数组名数组名常量表达式常量表达式;n例如例如:int a10;它表示数组名为它表示数组名为a,此数组为整型,有,此数组为整型,有10个整型元素。个整型元素。n说明:说明:n数组名命名规则和变量名相同。数组名命名规则和变量名相同。n方括号中的常量表达式的值表示元素的个数,即数组长方括号中的常量表达式的值表示元素的个数,即数组长度。例如,在度。例如,在“int a10;”中,中,10表示表示a数组有数组有10个元素个元素,下标从
6、下标从0开始开始,这这10个元素是:个元素是:a0,a1 a9。注意最后一个元素是。注意最后一个元素是a9而不是而不是a10。n常量表达式中可以包括常量、常变量和符号常量,常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。也就是说,但不能包含变量。也就是说,C+不允许对数组的不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。过程中变量的值。int a10;int a2*5;const int n=3;int an*2;int n;cinn;int an;正确正确正确正确正确正确错误错误5.2.2 引用一维数组的元素引
7、用一维数组的元素n数组必须先定义,然后使用。只能逐个引用数数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部组元素的值而不能一次引用整个数组中的全部元素的值。元素的值。n数组元素的表示形式:数组元素的表示形式:数组名数组名下标下标n下标可以是整型常量或整型表达式下标可以是整型常量或整型表达式(整型表达整型表达式中可以有变量式中可以有变量)。例如。例如:n注意:在注意:在c+中,默认数组元素的下标从中,默认数组元素的下标从0开开始。始。a0=a5+a7-a2*3int n;n=3;a1=a0+an*2正确正确正确正确n例例5.1 数组元素的引用。数组元素的引用。#i
8、nclude using namespace std;int main()int i,a10;for(i=0;i=0;i-)coutai;coutendl;return 0;运行结果如下:运行结果如下:9 8 7 6 5 4 3 2 1 05.2.3 一维数组的初始化一维数组的初始化初始化有多种方法:初始化有多种方法:n在定义数组时对所有数组元素赋予初值。在定义数组时对所有数组元素赋予初值。int a6=6,4,7,1,9,5;n可以只给一部分元素赋值。可以只给一部分元素赋值。int a6=6,4,7;结果:结果:a0=6 a1=4 a2=7 其余元素均为其余元素均为0n如果想使一个数组中全部
9、元素值为如果想使一个数组中全部元素值为1,可以写成,可以写成 int a6=1,1,1,1,1,1;不能写成不能写成 int a6=1*6;n在对全部数组元素赋初值时,可以不指定数组在对全部数组元素赋初值时,可以不指定数组长度。长度。例如:例如:int a5=9,2,1,5,8;也可以写成也可以写成 int a=9,2,1,5,8;如果未指定数组长度,则方括号内所提供初值的如果未指定数组长度,则方括号内所提供初值的个数即为数组长度。个数即为数组长度。5.2.4 一维数组程序举例一维数组程序举例n附加例:求数组元素之和。假设有附加例:求数组元素之和。假设有10个元素个元素(都为整数),都依赖于键
10、盘的输入:(都为整数),都依赖于键盘的输入:#includeusing namespace std;int main()int a10;int i,s;s=0;cout“请依次输入请依次输入 10个数组元素个数组元素:n”;for(i=0;iai;for(i=0;i10;i+)s=s+ai;cout “和和=s endl;return 0;n例例 5.2 用数组来处理求用数组来处理求Fibonacci数列问题。数列问题。比如要用数组来求数列中的前比如要用数组来求数列中的前20个数。个数。#include#include using namespace std;int main()int i;i
11、nt f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0)coutendl;coutsetw(8)fi;coutendl;return 0;运行结果如下:运行结果如下:(空一行)(空一行)1 1 2 3 5 8 13 21 34 55 89 144 233 377 610987 1597 2584 4181 6765n例例5.3 编写程序,用起泡法对编写程序,用起泡法对10个数排序个数排序(按按由小到大顺序由小到大顺序)。n可以推知,如果有可以推知,如果有n个数,则要进行个数,则要进行n-1趟比趟比较较(和交换和交换)。在第。
12、在第1趟中要进行趟中要进行n-1次两两比较,次两两比较,在第在第j趟中要进行趟中要进行n-j次两两比较。次两两比较。运行情况如下:运行情况如下:input 10 numbers:3 5 9 11 33 6-9-76 100 123 the sorted numbers:-76-9 3 5 6 9 11 33 100 123#include using namespace std;int main()int a10;int i,j,t;coutinput 10 numbers:endl;for(i=0;iai;coutendl;for(j=0;j9;j+)for(i=0;iai+1)t=ai;a
13、i=ai+1;ai+1=t;coutthe sorted numbers:endl;for(i=0;i10;i+)coutai;coutendl;return 0;5.3 二维数组的定义和引用二维数组的定义和引用n二维数组的引入二维数组的引入n有些数据要依赖于两个因素才能惟一地确定,例如有有些数据要依赖于两个因素才能惟一地确定,例如有3个个学生,每个学生有学生,每个学生有4门课的成绩。那么一个成绩数据取决门课的成绩。那么一个成绩数据取决于两个数据:哪个学生于两个数据:哪个学生(学生序号学生序号)、哪一门课(课程序、哪一门课(课程序号)。号)。n定义二维数组:定义二维数组:int a34;要访问
14、第要访问第3个学生的第个学生的第4门课程成绩:门课程成绩:a23(a23代表第代表第3行第行第4列的元素,因为两个下标都从列的元素,因为两个下标都从0开始开始)学生序号学生序号课程课程1课程课程2课程课程3课程课程41679176652455773813786986345.3.1 定义二维数组定义二维数组n形式:形式:类型标识符类型标识符 数组名数组名常量表达式常量表达式常量表达式常量表达式n例如:例如:float a34,b510;注意不能写成:注意不能写成:float a3,4,b5,10;n我们可以把二维数组看作是一种特殊的一维数组:我们可以把二维数组看作是一种特殊的一维数组:它的元素又
15、是一个一维数组。例如,可以把它的元素又是一个一维数组。例如,可以把a看看作是一个一维数组,它有作是一个一维数组,它有3个元素:个元素:a0,a1,a2,每个元素又是一个包含,每个元素又是一个包含4个元个元素的一维数组。素的一维数组。n C+中,二维数组中元素排列的顺序是:按中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素,依次下去。再存放第二行的元素,依次下去。n C+允许使用多维数组。如:允许使用多维数组。如:int a234;定义定义int型三维数组型三维数组a,它有,它有234=24个元个元素。多维数
16、组元素在内存中的排列顺序:第一素。多维数组元素在内存中的排列顺序:第一维的下标变化最慢,最右边的下标变化最快。维的下标变化最慢,最右边的下标变化最快。a000a001a002a003a010a011a012a013a020a021a022a023a100a101a102a103a110a111a112a113a120a121a122a123 5.3.2 二维数组的引用二维数组的引用n二维数组的元素的表示形式为二维数组的元素的表示形式为 数组名数组名下标下标 下标下标 如如:a23下标可以是整型表达式,如下标可以是整型表达式,如a2-12*2-1。不要写成不要写成a2,3,a2-1,2*2-1形
17、式。形式。注意在访问数组元素时,不要超出数组的表达范围。注意在访问数组元素时,不要超出数组的表达范围。int a34;a34=15;错误错误n请严格区分在定义数组时用的请严格区分在定义数组时用的a34和引用元和引用元素时的素时的a34的区别。前者的区别。前者a34用来定义用来定义数组的维数和各维的大小,后者数组的维数和各维的大小,后者a34中的中的3和和4是下标值,是下标值,a34代表某一个元素。代表某一个元素。5.3.3 二维数组的初始化二维数组的初始化方法:方法:n分行给二维数组赋初值。分行给二维数组赋初值。int a34=1,2,3,4,5,6,7,8,9,10,11,12;n所有数据写
18、在一个花括号内,按顺序对各元素赋所有数据写在一个花括号内,按顺序对各元素赋值值int a34=1,2,3,4,5,6,7,8,9,10,11,12;n对部分元素赋值对部分元素赋值int a34=1,5,9int a34=1,5,6,9int a34=1,5,6int a34=1,9n可以忽略第可以忽略第1维的长度维的长度int a4=1,2,3,4,5,6,7,8,9,10,11,12int a4=0,0,3,0,101 2 3 45 6 7 89 10 11 121 0 0 05 0 0 09 0 0 01 0 0 05 6 0 09 0 0 01 0 0 05 6 0 00 0 0 01
19、0 0 00 0 0 09 0 0 05.3.4 二维数组程序举例二维数组程序举例n例例5.4 将一个二维数组行和列元素互换,存到将一个二维数组行和列元素互换,存到另一个二维数组中。例如:另一个二维数组中。例如:a=1 2 34 5 6b=1 42 5 3 6#include using namespace std;int main()int a23=1,2,3,4,5,6;int b32,i,j;coutarray a:endl;for(i=0;i=1;i+)for(j=0;j=2;j+)coutaij;bji=aij;coutendl;coutarray b:endl;for(i=0;i=
20、2;i+)for(j=0;j=1;j+)coutbij;coutendl;return 0;n例例5.5 有一个有一个34的矩阵,要求编程序求出其的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号中值最大的那个元素的值,以及其所在的行号和列号。和列号。思想:开始时把思想:开始时把a00的值赋给变量的值赋给变量max,然后让下一个元素与它比较,将二者中值大者然后让下一个元素与它比较,将二者中值大者保存在保存在max中,然后再让下一个元素与新的中,然后再让下一个元素与新的max比,直到最后一个元素比完为止。比,直到最后一个元素比完为止。max最后的值就是数组所有元素中的最大值。最后的
21、值就是数组所有元素中的最大值。#include using namespace std;int main()int i,j,row=0,colum=0,max;int a34=5,12,23,56,19,28,37,46,-12,-34,6,8;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;row=i;colum=j;coutmax=max,row=row ,colum=colummax)max=x;#include using namespace std;int main()int max_value(int x,int max);int i,j,r
22、ow=0,colum=0,max;int a34=5,12,23,56,19,28,37,46,-12,-34,6,8;max=a00;for(i=0;i=2;i+)for(j=0;j=3;j+)max=max_value(aij,max);if(max=aij)row=i;colum=j;coutmax=max,row=row,colum=colummax)return x;else return max;2、用数组名作为函数参数,可以用数组名作函数用数组名作为函数参数,可以用数组名作函数参数,此时实参与形参都用数组名参数,此时实参与形参都用数组名(也可以用指(也可以用指针变量,见第针变量,
23、见第6章)。章)。n附加例:利用函数实现将一个数组的各元素都变为原附加例:利用函数实现将一个数组的各元素都变为原来的来的n倍。(倍。(n由键盘输入。)由键盘输入。)317852ab62 14 16 10 4#includeusing namespace std;int main()int a10;int i,t,n;coutt;coutn;cout请输入数组中的各个元素请输入数组中的各个元素:n;for(i=0;iai;change(a,t,n);for(i=0;it;i+)coutai;coutendl;return 0;void change(int b,int t,int n)int i
24、;for(i=0;it;i+)bi=n*bi;n数组名做函数参数的相关说明:数组名做函数参数的相关说明:(1)如果函数实参是数组名,形参也应为数组名)如果函数实参是数组名,形参也应为数组名(或指或指针变量针变量),形参不能声明为普通变量,形参不能声明为普通变量(如如int array;)。实参数组与形参数组类型应一致,如不一致,结果将实参数组与形参数组类型应一致,如不一致,结果将出错。出错。(2)数组名代表数组首元素的地址,并不代表数组中的)数组名代表数组首元素的地址,并不代表数组中的全部元素。因此用数组名作函数实参时全部元素。因此用数组名作函数实参时,是将实参数组是将实参数组首元素的地址传递
25、给形参。首元素的地址传递给形参。(3)形参是数组名,它代表的是形参数组首元素的地址。)形参是数组名,它代表的是形参数组首元素的地址。在调用函数时,将实参数组首元素的地址传递给形参在调用函数时,将实参数组首元素的地址传递给形参数组名。这样,实参数组和形参数组就共占同一段内数组名。这样,实参数组和形参数组就共占同一段内存单元。形参数组中各元素的值如果发生变化,就意存单元。形参数组中各元素的值如果发生变化,就意味着实参数组元素的值发生同样的变化。味着实参数组元素的值发生同样的变化。(4)声明形参数组并不意味着真正建立一个包含若干元)声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也
26、不对它分配存储单元,只素的数组,在调用函数时也不对它分配存储单元,只是用是用b这样的形式表示这样的形式表示b是一维数组名,以接收实参是一维数组名,以接收实参传来的地址。因此传来的地址。因此b 中方括号内的数值并无实际作中方括号内的数值并无实际作用,编译系统对一维数组方括号内的内容不予处理。用,编译系统对一维数组方括号内的内容不予处理。形参一维数组的声明中可以写元素个数,也可以不写。形参一维数组的声明中可以写元素个数,也可以不写。函数首部的下面几种写法都合法,作用相同。函数首部的下面几种写法都合法,作用相同。void change(int b10,int n)/指定元素个数与实指定元素个数与实
27、参数组相同参数组相同void change(int b,int n)/不指定元素个数不指定元素个数void change(int b5,int n)/指定元素个数与实参指定元素个数与实参 数组不同数组不同3、用二维数组名作函数参数、用二维数组名作函数参数如果用二维数组名作为实参和形参,在对形参数如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维组声明时,必须指定第二维(即列即列)的大小,且应的大小,且应与实参的第二维的大小相同。第一维的大小可以与实参的第二维的大小相同。第一维的大小可以指定,也可以不指定。如指定,也可以不指定。如int array310;/形参数组的两个维都指定
28、形参数组的两个维都指定或或 int array10;/第一维大小省略第一维大小省略二者都合法而且等价。但是不能把第二维的大小二者都合法而且等价。但是不能把第二维的大小省略。下面的形参数组写法不合法:省略。下面的形参数组写法不合法:int array;/不能确定数组的每一行有多少列元素不能确定数组的每一行有多少列元素int array 3;/不指定列数就无法确定数组的结构不指定列数就无法确定数组的结构n例例5.7 用选择法对数组中用选择法对数组中10个整数按由小到大排个整数按由小到大排序。序。所谓选择法就是先将所谓选择法就是先将10个数中最小的数与个数中最小的数与a0对换对换;再将再将a1到到a
29、9中最小的数与中最小的数与a1对换对换每比较一轮每比较一轮,找出一个未经排序的数中最小的一个。找出一个未经排序的数中最小的一个。共比较共比较9轮。轮。#include using namespace std;int main()void select_sort(int array,int n);int a10,i;coutenter the originl array:endl;for(i=0;iai;coutendl;select_sort(a,10);coutthe sorted array:endl;for(i=0;i10;i+)coutai ;coutendl;return 0;voi
30、d select_sort(int array,int n)int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;n例例5.8 有一个有一个的矩阵,求矩阵中所有元的矩阵,求矩阵中所有元素中的最大值。要求用函数处理。素中的最大值。要求用函数处理。#include using namespace std;int main()int max_value(int array4);int a34=11,32,45,67,22,44,66,88,15,72,43
31、,37;coutmax value is max_value(a)endl;return 0;int max_value(int array4)int i,j,max;max=array00;for(i=0;i3;i+)for(j=0;jmax)max=arrayij;return max;5.5 字符数组字符数组n用来存放字符数据的数组是字符数组,字符数用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。字符数组具有组中的一个元素存放一个字符。字符数组具有数组的共同属性。数组的共同属性。5.5.1 字符数组的定义和初始化字符数组的定义和初始化n对字符数组进行初始化,最容易理解
32、的方式是逐个字符赋给对字符数组进行初始化,最容易理解的方式是逐个字符赋给数组中各元素。如数组中各元素。如char c10=I,a,m,h,a,p,p,y;如果花括号中提供的初值个数大于数组长度,则按语法错误如果花括号中提供的初值个数大于数组长度,则按语法错误处理。处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符面那些元素,其余的元素自动定为空字符 0。如果提供的初值个数与预定的数组长度相同,在定义时可以如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组
33、长度。省略数组长度,系统会自动根据初值个数确定数组长度。5.5.2 字符数组的赋值和引用字符数组的赋值和引用n只能对字符数组的元素赋值,而不能用赋值语只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。句对整个数组赋值。char c5;c=c,h,i,n,a;char a5,b5=c,h,i,n,a;a=b;a0=b0;错误错误错误错误正确正确5.5.3 字符串和字符串结束标志字符串和字符串结束标志n用一个字符数组可以存放一个字符串中的字符。用一个字符数组可以存放一个字符串中的字符。char str12=I,a,m,h,a,p,p,y;用一维字符数组用一维字符数组str来存放一个字符串来
34、存放一个字符串I am happy中的字符。字符串的实际长度中的字符。字符串的实际长度(10)(10)与数组长度与数组长度(12)(12)不不相等,在存放上面相等,在存放上面1010个字符之外,系统对字符数组最个字符之外,系统对字符数组最后两元素自动填补空字符后两元素自动填补空字符0。为了测定字符串的实为了测定字符串的实际长度,际长度,C+规定了一个规定了一个“字符串结束标志字符串结束标志”,以字符,以字符0代表。在上面的数组中,第代表。在上面的数组中,第11个字符为个字符为0,就表,就表明字符串的有效字符为其前面的明字符串的有效字符为其前面的10个字符。也就是说,个字符。也就是说,遇到字符遇
35、到字符0就表示字符串到此结束,由它前面的就表示字符串到此结束,由它前面的字符组成字符串。字符组成字符串。n对字符数组初始化还有一种方法:对字符数组初始化还有一种方法:用字符串用字符串常量来初始化字符数组。例如常量来初始化字符数组。例如char str10=China;char str=I,a,m,h,a,p,p,y;数组数组str的长度是的长度是11(因为字符串常量的最后因为字符串常量的最后由系统加上一个由系统加上一个0)。char str=I am happy;char str=I am happy;数组数组str的长度是的长度是10char str=I,a,m,h,a,p,p,y,0;数组
36、数组str的长度是的长度是115.5.4 字符数组的输入输出字符数组的输入输出n字符数组的输入输出可以有两种方法:字符数组的输入输出可以有两种方法:n(1)逐个字符输入输出,如例逐个字符输入输出,如例5.9。n(2)将整个字符串一次输入或输出。例如:将整个字符串一次输入或输出。例如:char str20;cinstr;/用字符数组名输入字符串用字符数组名输入字符串coutstr;/用字符数组名输出字符串用字符数组名输出字符串输入:输入:china 结果:结果:chinan注意:注意:n(1)输出的字符不包括结束符输出的字符不包括结束符0。n(2)输出字符串时,输出字符串时,cout流中用字符数
37、组名,流中用字符数组名,而不是数组元素名。而不是数组元素名。n(3)如果数组长度大于字符串实际长度,也只如果数组长度大于字符串实际长度,也只输出到遇输出到遇0结束。结束。n(4)如果一个字符数组中包含一个以上如果一个字符数组中包含一个以上0,则遇第一个则遇第一个0时输出就结束。时输出就结束。n(5)用用cin从键盘向计算机输入一个字符串时,从键盘向计算机输入一个字符串时,从键盘输入的字符串应短于已定义的字符数组从键盘输入的字符串应短于已定义的字符数组的长度,否则会出现问题。的长度,否则会出现问题。5.5.5 字符串处理函数字符串处理函数n由于字符串使用广泛,由于字符串使用广泛,C+提供了一些字
38、符提供了一些字符串函数,使得用户能很方便地对字符串进行处串函数,使得用户能很方便地对字符串进行处理。它们是放在函数库中的,在理。它们是放在函数库中的,在string文件中文件中定义。如果程序中要使用这些字符串函数,应定义。如果程序中要使用这些字符串函数,应该用该用#include把把string文件包含到文件包含到程序文件中。程序文件中。n1.字符串连接函数字符串连接函数 strcat strcat(char,const char)n该函数有两个参数,均是字符数组。函数的作用是:该函数有两个参数,均是字符数组。函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的将第二个字符数组中的字符
39、串连接到前面字符数组的字符串的后面。第二个字符数组被指定为字符串的后面。第二个字符数组被指定为const,以,以保证该数组中的内容不会在函数调用期间修改。连接保证该数组中的内容不会在函数调用期间修改。连接后的字符串放在第一个字符数组中,函数调用后得到后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址。的函数值,就是第一个字符数组的地址。char str130=Peoples Republic of;char str2=China;coutstrcat(str1,str2);输出:输出:Peoples Republic of Chinastrcat(str1,str
40、2);coutstr1;2.字符串复制函数字符串复制函数strcpy strcpy(char,const char)n它的作用是将第二个字符数组中的字符串复制到第一它的作用是将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆个字符数组中去,将第一个字符数组中的相应字符覆盖。并加上一个盖。并加上一个0,函数调用后得到的函数值,就函数调用后得到的函数值,就是第一个字符数组的地址是第一个字符数组的地址.例如:例如:char str110,str2=China;strcpy(str1,str2);coutstr1;输出结果:输出结果:Chinachar str130=P
41、eoples Republic of;char str2=China;coutstrcpy(str1,str2);输出结果:输出结果:Chinan说明:说明:(1)在调用在调用strcpy函数时,第一个参数必须是数函数时,第一个参数必须是数组名组名(如如str1),第二个参数可以是字符数组,第二个参数可以是字符数组名,也可以是一个字符串常量。名,也可以是一个字符串常量。strcpy(str1,”china”);(2)可以用可以用strcpy函数将一个字符串中前若干个函数将一个字符串中前若干个字符复制到字符数组中去。下例是将字符复制到字符数组中去。下例是将str2的的前前2个字符复制到个字符复制
42、到str1中去,然后再加上一中去,然后再加上一个个0.strcpy(str1,str2,2);char str130=Peoples Republic of;char str2=China;cout1字符串字符串2 2,函数值为一正整数。,函数值为一正整数。(3)(3)如果字符串如果字符串11字符串字符串2 2,函数值为一负整数。,函数值为一负整数。n比较规则:对两个字符串自左至右逐个字符相比较规则:对两个字符串自左至右逐个字符相比比(按按ASCII码值大小比较码值大小比较),直到出现不同的,直到出现不同的字符或遇到字符或遇到0为止。如全部字符相同,则为止。如全部字符相同,则认为相等;若出现不
43、相同的字符,则以第一个认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。不相同的字符的比较结果为准。coutstrcmp(“cda,“cdab);负整数负整数coutstrcmp(“cfa,“cfa);coutstr2)cout0)coutyes;错误错误n字符串长度函数字符串长度函数strlen strlen(const char)n它是测试字符串长度的函数。其函数的值为字它是测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括符串中的实际长度,不包括0在内。如在内。如 char str10=China;coutstrlen(str);输出结果:输出结果:55.5.
44、6 字符数组应用举例字符数组应用举例n例例5.10 有有3个字符串个字符串,要求找出其中最大者。要要求找出其中最大者。要求用函数调用。求用函数调用。#include#include using namespace std;int main()void max_string(char str30,int i);int i;char country_name330;for(i=0;icountry_namei;max_string(country_name,3);return 0;void max_string(char str30,int n)int i;char string30;strcpy
45、(string,str0);for(i=0;i0)strcpy(string,stri);coutendlthe largest string is stringendl;5.6 字符串类和字符串变量字符串类和字符串变量n用字符数组来存放字符串并不是最理想和最安用字符数组来存放字符串并不是最理想和最安全的方法。全的方法。nC+提供了一种新的数据类型提供了一种新的数据类型字符串类字符串类型型(string类型类型),在使用方法上,它和,在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字类型一样,可以用来定义变量,这就是字符串变量。符串变量。n实际上,实际上,string并不是
46、并不是C+语言本身具有的基语言本身具有的基本类型,它是在本类型,它是在C+标准库中声明的一个字标准库中声明的一个字符串类,要是用符串类,要是用string类,必须在程序文件开类,必须在程序文件开头加上头加上#include5.6.1 字符串变量的定义和引用字符串变量的定义和引用n1、定义字符串变量、定义字符串变量n和其他类型变量一样,字符串变量必须先定义后使和其他类型变量一样,字符串变量必须先定义后使用,定义字符串变量要用类名用,定义字符串变量要用类名string。string string1;/定义定义string1为字符串变量为字符串变量string string2=”China”;/定义
47、同时初始化定义同时初始化在定义字符串变量时不需指定长度,长度随其中的字在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。符串长度而改变。2、对字符串变量的赋值、对字符串变量的赋值在定义了字符串变量后,既可以用字符串常量给在定义了字符串变量后,既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。一个字符串变量赋值。string str1,str2;str1=Canada;str2=str1;coutstr1 str2;可以对字符串变量中某一字符进行操作,如可以对字符串变量中某一字符进行操作,如 string wo
48、rd=Then;word2=a;cout string1;/从键盘输入一个字符串给从键盘输入一个字符串给string1cout(大于大于)、=(大于或等于大于或等于)、=(小于或等于小于或等于)等关系运算符来进行字符串的比较。等关系运算符来进行字符串的比较。5.6.3 字符串数组字符串数组n不仅可以用不仅可以用string定义字符串变量,也可以用定义字符串变量,也可以用string定义字符串数组。如定义字符串数组。如string name5;/定义一个字符串数组,它包含定义一个字符串数组,它包含5个字符串元素个字符串元素string name5=”Zhang”,”Li”,”Fun”,”Wang
49、”,”Tan”;/定义一个字符串数组并初始化定义一个字符串数组并初始化此时此时name数组如图数组如图5.11所示。所示。n可以看到:可以看到:(1)在一个字符串数组中包含若干个在一个字符串数组中包含若干个(现为现为5个个)元素,每个元元素,每个元素相当于一个字符串变量。素相当于一个字符串变量。(2)并不要求每个字符串元素具有相同的长度,即使对同一并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个元素个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。重新赋值,其长度就可能发生变化。(3)在字符串数组的每一个元素中存放一
50、个字符串,而不是在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果用字一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用一个符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。一维字符数组存放一个字符串。(4)每一个字符串元素中只包含字符串本身的字符而不包括每一个字符串元素中只包含字符串本身的字符而不包括 0。5.6.4 字符串运算举例字符串运算举例n例例5.11 输入输入3个字符串,要求将字母按由小到个字符串,要求将字母按由小到大的顺序输出。大的顺序输出。#include#in