中国高等院校计算机基础教育课程体系规划教材讲授第5章_第1页
中国高等院校计算机基础教育课程体系规划教材讲授第5章_第2页
中国高等院校计算机基础教育课程体系规划教材讲授第5章_第3页
中国高等院校计算机基础教育课程体系规划教材讲授第5章_第4页
中国高等院校计算机基础教育课程体系规划教材讲授第5章_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章章 数组数组5.1 数组的概念数组的概念5.2 一维数组的定义和引用一维数组的定义和引用5.3 二维数组的定义和引用二维数组的定义和引用5.4 用数组名作函数参数用数组名作函数参数5.5 字符数组字符数组*5.6 c+处理字符串的方法处理字符串的方法字符串类与字字符串类与字符串变量符串变量概括地说:概括地说: 数组是有序数据的集合数组是有序数据的集合。要寻找一个。要寻找一个数组中的某一个元素必须给出两个要素,即数组中的某一个元素必须给出两个要素,即数组名数组名和下标和下标。数组名和下标惟一地标识一个数组中的一数组名和下标惟一地标识一个数组中的一个元素。个元素。数组是有类型属性的。同一数

2、组中的每一个元素都数组是有类型属性的。同一数组中的每一个元素都必须属于同一数据类型。一个数组在内存中占一片必须属于同一数据类型。一个数组在内存中占一片连续的存储单元。如果有一个整型数组连续的存储单元。如果有一个整型数组a,假设数,假设数组的起始地址为组的起始地址为2000,则该数组在内存中的存储情,则该数组在内存中的存储情况如图况如图5.1所示。所示。5.1 数组的概念数组的概念 图图5.1引入数组就不需要在程序中定义大量的变量,大大引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了

3、数据间的联系。义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可以大大地提高编程和解题的效率,加强了程序的可读性。读性。c+用方括号来表示下标,如用用方括号来表示下标,如用s1,s2,s3 分别代表分别代表s1,s2,s3。定义一维数组的一般格式为定义一维数组的一般格式为类型标识符类型标识符 数组名常量表达式;数组名常量表达式;例如例如int a10;它表示数组名为它表示数组名为a,此数组为整型,有,此数组为整型,有10个元素。个元素。说明:说明:(1) 数组名定名规则

4、和变量名相同,遵循标识符定数组名定名规则和变量名相同,遵循标识符定名规则。名规则。5.2 一维数组的定义和引用一维数组的定义和引用 5.2.1 定义一维数组定义一维数组(2) 用方括号括起来的常量表达式表示下标值,用方括号括起来的常量表达式表示下标值,如如下面的写法是合法的:下面的写法是合法的: int a10;int a2*5;int an*2; /假设前面已定义了假设前面已定义了n为常变量为常变量 (3) 常量表达式的值表示元素的个数,即数组长度。常量表达式的值表示元素的个数,即数组长度。例如,在例如,在“int a10;”中,中,10表示表示a数组有数组有10个个元素元素,下标从下标从0

5、开始开始,这这10个元素是:个元素是: a0,a1,a2,a3,a4,a5,a6,a7, a8,a9。注意最后一个元素是。注意最后一个元素是a9而不而不是是a10。(4) 常量表达式中可以包括常量、常变量和符号常常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。量,但不能包含变量。也就是说,也就是说,c+不允许对数不允许对数组的大小作动态定义,即数组的大小不依赖于程序组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是运行过程中变量的值。例如,下面这样定义数组是不行的:不行的:int n;cinn; /输入输入a数组的长度数组的长度int an;

6、/企图根据企图根据n的值决定数组的长度的值决定数组的长度 如果把第如果把第1,2行改为下面一行就合法了行改为下面一行就合法了:const int n=5;数组必须先定义,然后使用。只能逐个引用数组元数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。素的值而不能一次引用整个数组中的全部元素的值。数组元素的表示形式为数组元素的表示形式为数组名下标数组名下标下标可以是整型常量或整型表达式。例如下标可以是整型常量或整型表达式。例如a0= a5+ a7- a2*35.2.2 引用一维数组的元素引用一维数组的元素例例5.1 数组元素的引用。数组元素的引用。#incl

7、ude 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 0程序使程序使a0a9的值为的值为09,然后按逆序输出。,然后按逆序输出。(1) 在定义数组时分别对数组元素赋予初值。在定义数组时分别对数组元素赋予初值。例如例如int a10=0,1,2,3,4,5,6,7,8,9;(2) 可以只给一部分元素赋值。可以只给一部分元素赋值。例如例如int a10=0,1,2,3,4; (3) 如果想使一个数组中全部元素

8、值为如果想使一个数组中全部元素值为1,可以写成可以写成int a10=1,1,1,1,1,1,1,1,1,1;不能写成不能写成 int a10=1*10;不能给数组整体赋初值不能给数组整体赋初值。(4) 在对全部数组元素赋初值时,可以不指定数组在对全部数组元素赋初值时,可以不指定数组长度。长度。例如例如int a5=1,2,3,4,5;可以写成可以写成 int a=1,2,3,4,5;5.2.3 一维数组的初始化一维数组的初始化5.2.4 一维数组程序举例一维数组程序举例例例5.3 编写程序,用起泡法对编写程序,用起泡法对10个数排序个数排序(按由小到按由小到大顺序大顺序)。起泡法的思路是:将

9、相邻两个数比较,将小的调到起泡法的思路是:将相邻两个数比较,将小的调到前头。见图前头。见图5.2。然后进行第然后进行第2趟比较,对余下的前面趟比较,对余下的前面5个数按上法进个数按上法进行比较,见图行比较,见图5.3。 图图5.2 图图5.3可以推知,如果有可以推知,如果有n个数,则要进行个数,则要进行n-1趟比较趟比较(和和交换交换)。在第。在第1趟中要进行趟中要进行n-1次两两比较,在第次两两比较,在第j趟趟中要进行中要进行n-j次两两比较。次两两比较。根据以上思路写出程序,根据以上思路写出程序,今设今设n=10,本例定义数组,本例定义数组长度为长度为11,a0不用,只用不用,只用a1a1

10、0,以,以符合人们的习惯。符合人们的习惯。从前面的叙述可知,应该进行从前面的叙述可知,应该进行9趟比较和交换。趟比较和交换。#include using namespace std;int main( ) int a11; int i,j,t; coutinput 10 numbers :endl; for (i=1;iai; coutendl; for (j=1;j=9;j+) /共进行共进行9趟比较趟比较 for(i=1;iai+1) /如果前面的数大于后面的数如果前面的数大于后面的数 t=ai;ai=ai+1;ai+1=t; /交换两个数的位置,使小数上浮交换两个数的位置,使小数上浮 c

11、outthe sorted numbers :endl; for(i=1;i11;i+) /输出输出10个数个数 coutai ; coutendl; return 0;运行情况如下:运行情况如下: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具有两个下标的数组称为二维数组。具有两个下标的数组称为二维数组。有些数据要依有些数据要依赖于两个因素才能惟一地确定,例如有赖于两个因素才能惟一地确定,例如有3个学生,个学生,每个学生有每个学生有4门课的成绩,显然,成

12、绩数据是一个门课的成绩,显然,成绩数据是一个二维表,如书中表二维表,如书中表5.1所示。所示。想表示第想表示第3个学生第个学生第4门课的成绩,就需要指出学生门课的成绩,就需要指出学生的序号和课程的序号两个因素,在数学上以的序号和课程的序号两个因素,在数学上以s3,4表表示。示。5.3 二维数组的定义和引用二维数组的定义和引用定义二维数组的一般形式为定义二维数组的一般形式为类型标识符类型标识符 数组名常量表达式常量表达式数组名常量表达式常量表达式例如例如float a34,b510;定义定义a为为34(3行行4列列)的单精度数组,的单精度数组,b为为510(5行行10列列)的单精度数组。的单精度

13、数组。注意不能写成注意不能写成“float a3,4,b5,10;”。c+对二维数组采用这样对二维数组采用这样的定义方式,使我们可以把二维数组看作是一种特的定义方式,使我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。殊的一维数组:它的元素又是一个一维数组。例如例如,可以把可以把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素:a0,a1,a2,每个元素又是一个包含,每个元素又是一个包含4个个元素的一维数组,见图元素的一维数组,见图5.4。a0,a1,a2是是3个一维数组的名字。个一维数组的名字。5.3.1 定义二维数组定义二维数组c+中,二维数组中元素排

14、列的顺序是中,二维数组中元素排列的顺序是:按行存放按行存放,即在内存中先顺序存放第一行的元素,再存放第二即在内存中先顺序存放第一行的元素,再存放第二行的元素。图行的元素。图5.5表示对表示对a34数组存放的顺数组存放的顺序。序。图图5.5c+允许使用多维数组。有了二维数组的基础,再允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。掌握多维数组是不困难的。二维数组的元素的表示形式为二维数组的元素的表示形式为数组名数组名 下标下标下标下标如如a23。下标可以是整型表达式,如。下标可以是整型表达式,如a2-12*2-1。不要写成。不要写成a2,3,a2-1,2*2-1形式。形式。数组元

15、素是左值,可以出现在表达式中,也可以被数组元素是左值,可以出现在表达式中,也可以被赋值,赋值,例如例如b12=a23/2;在使用数组元素时,应该注意下标值应在已定义的在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。常出现的错误是数组大小的范围内。常出现的错误是5.3.2 二维数组的引用二维数组的引用int a34; /定义定义3行行4列的数组列的数组a34=15; /引用引用a34元素元素定义定义a为为34的数组,它可用的行下标值最大为的数组,它可用的行下标值最大为2,列坐标值最大为列坐标值最大为3。最多可以用到最多可以用到a23,a34就超过了数组的范围。就超过了数组的范围。可

16、以用下面的方法对二维数组初始化:可以用下面的方法对二维数组初始化:(1) 分行给二维数组赋初值。分行给二维数组赋初值。如如int a34=1,2,3,4,5,6,7,8,9,10,11,12; 这种赋初值方法比较直观,把第这种赋初值方法比较直观,把第1个花括号内的数个花括号内的数据赋给第据赋给第1行的元素,第行的元素,第2个花括号内的数据赋给第个花括号内的数据赋给第2行的元素行的元素即按行赋初值。即按行赋初值。(2) 可以将所有数据写在一个花括号内,按数组排可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。列的顺序对各元素赋初值。如如int a34=1,2,3,4,5,6,7,8

17、,9,10,11,12;效果与前相同。但以第效果与前相同。但以第1种方法为好,一行对一行,种方法为好,一行对一行,界限清楚。用第界限清楚。用第2种方法如果数据多,写成一大片,种方法如果数据多,写成一大片,容易遗漏,也不易检查。容易遗漏,也不易检查。5.3.3 二维数组的初始化二维数组的初始化(3) 可以对部分元素赋初值。可以对部分元素赋初值。如如int a34=1,5,9;它的作用是只对各行第它的作用是只对各行第1列的元素赋初值,其余元列的元素赋初值,其余元素值自动置为素值自动置为0。赋初值后数组各元素为。赋初值后数组各元素为1 0 0 05 0 0 09 0 0 0 也可以对各行中的某一元素

18、赋初值:也可以对各行中的某一元素赋初值:int a34=1,0,6,0,0,11; 初始化后的数组元素如下:初始化后的数组元素如下:1 0 0 00 6 0 00 0 11 0如稀疏矩阵赋值如稀疏矩阵赋值第第3行不赋初值。也可以对第行不赋初值。也可以对第2行不赋初值行不赋初值:int a34=1,9;(4) 如果对全部元素都赋初值如果对全部元素都赋初值(即提供全部初始数据即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。维的长度不能省。如如int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成可

19、以写成int a4=1,2,3,4,5,6,7,8,9,10,11,12;系统会根据数据总个数分配存储空间,一共系统会根据数据总个数分配存储空间,一共12个数个数据,每行据,每行4列,当然可确定为列,当然可确定为3行。行。在定义时也可以只对部分元素赋初值而省略第一维在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。的长度,但应分行赋初值。如如int a4=0,0,3,0,10;这样的写法,能通知编译系统:这样的写法,能通知编译系统: 数组共有数组共有3行。数行。数组各元素为组各元素为 0 0 3 00 0 0 00 10 0 0c+在定义数组和表示数组元素时采用在定义数组和表

20、示数组元素时采用a这种两个方括号的方式,对数组初始化时十分有用,这种两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。它使概念清楚,使用方便,不易出错。常量和变量可以用作函数实参,同样数组元素也可常量和变量可以用作函数实参,同样数组元素也可以作函数实参,其用法与变量相同。以作函数实参,其用法与变量相同。数组名也可以数组名也可以作实参和形参,传递的是数组的起始地址。作实参和形参,传递的是数组的起始地址。1. 用数组元素作函数实参用数组元素作函数实参由于实参可以是表达式,而数组元素可以是表达式由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为

21、函数的实的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,将数组元素的值传送给参,与用变量作实参一样,将数组元素的值传送给形参变量。形参变量。5.4 用数组名作函数参数用数组名作函数参数例例5.6 有一个有一个34的矩阵,要求编程序求出其中值的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。最大的那个元素的值,以及其所在的行号和列号。开始时把开始时把a00的值赋给变量的值赋给变量max,然后让下一个元,然后让下一个元素与它比较,将二者中值大者保存在素与它比较,将二者中值大者保存在max中,然后再让下一中,然后再让下一个元素与新的个元素与新的max比,直到

22、最后一个元素比完为止。比,直到最后一个元素比完为止。max最最后的值就是数组所有元素中的最大值。后的值就是数组所有元素中的最大值。今设一函数今设一函数max_value,用来进行比较并返回结果。可编写,用来进行比较并返回结果。可编写程序如下:程序如下: #include using namespace std;int main( ) int max_value(int x,int max); /函数声明函数声明 int i,j,row=0,colum=0,max int a34=5,12,23,56,19,28,37,46,-12,-34,6,8; /数组初始化数组初始化 max=a00; f

23、or (i=0;i=2;i+) for (j=0;j=3;j+) max=max_value(aij,max); /调用调用max_value函数函数if(max=aij) /如果函数返回的是如果函数返回的是aij的值的值 row=i; /记下该元素行号记下该元素行号i colum=j; /记下该元素列号记下该元素列号j coutmax=max,row=row,colum=colummax) return x; /如果如果xmax,函数返回值为,函数返回值为x else return max; /如果如果xmax,函数返回值为,函数返回值为max 2. 用数组名作函数参数用数组名作函数参数可以

24、用数组名作函数参数,实参与形参都用数组名可以用数组名作函数参数,实参与形参都用数组名例例5.7 用选择法对数组中用选择法对数组中10个整数按由小到大排序。个整数按由小到大排序。所谓选择法就是先将所谓选择法就是先将10个数中最小的数与个数中最小的数与a0对换对换;再将再将a1到到a9中最小的数与中最小的数与a1对换对换每比较一轮每比较一轮,找找出一个未经排序的数中最小的一个。共比较出一个未经排序的数中最小的一个。共比较9轮。轮。根据此思路编写程序如下:根据此思路编写程序如下:#include using namespace std;int main( )void select_sort(int

25、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+) /输出输出10个已排好序的数个已排好序的数 coutai ; coutendl; return 0;void select_sort(int array,int n) /形参形参array是数组名是数组名int i,j,k,t; for(i=0;

26、in-1;i+)k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk;arrayk=arrayi;arrayi=t; 运行情况如下:运行情况如下: enter the originl array:6 9 -2 56 87 11 -54 3 0 77 /输入输入10个数个数the sorted array:-54 -2 0 3 6 9 11 56 77 87关于用数组名作函数参数有两点要说明:关于用数组名作函数参数有两点要说明:(1) 如果函数实参是数组名,形参也应为数组名如果函数实参是数组名,形参也应为数组名(或或指针变量指针变量),形参不能

27、声明为普通变量形参不能声明为普通变量(如如int array;)。实参数组与形参数组类型应一致(现都为实参数组与形参数组类型应一致(现都为int型),型),如不一致,结果将出错。如不一致,结果将出错。(2) 地址传递:地址传递: 数组名代表数组首元素的地址,并数组名代表数组首元素的地址,并不代表数组中的全部元素。不代表数组中的全部元素。因此用数组名作函数实因此用数组名作函数实参时参时,不是把实参数组的值传递给形参,而只是将不是把实参数组的值传递给形参,而只是将实参数组首元素的地址传递给形参。实参数组首元素的地址传递给形参。形参可以是数组名,也可以是指针变量形参可以是数组名,也可以是指针变量,它

28、们用来,它们用来接收实参传来的地址。如果形参是数组名,它代表接收实参传来的地址。如果形参是数组名,它代表的是形参数组首元素的地址。在调用函数时,将实的是形参数组首元素的地址。在调用函数时,将实参数组首元素的地址传递给形参数组名。参数组首元素的地址传递给形参数组名。这样,实这样,实参数组和形参数组就共占同一段内存单元。参数组和形参数组就共占同一段内存单元。见图见图5.6。图图5.6而用数组名作函数实参时而用数组名作函数实参时,改变形参数组元素的值改变形参数组元素的值将同时改变实参数组元素的值。将同时改变实参数组元素的值。在程序设计中往往在程序设计中往往有意识地利用这一特点改变实参数组元素的值。有

29、意识地利用这一特点改变实参数组元素的值。声明形参数组并不意味着真正建立一个包含若干元声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也不对它分配存储单元,素的数组,在调用函数时也不对它分配存储单元,只是用只是用array这样的形式表示这样的形式表示array是一维数组是一维数组名,以接收实参传来的地址。名,以接收实参传来的地址。函数首部的下面几种写法都合法,作用相同。函数首部的下面几种写法都合法,作用相同。void select_sort(int array10,int n) /指定元素个数与指定元素个数与实参数组相同实参数组相同void select_sort(int ar

30、ray,int n) /不指定元素个数不指定元素个数void select_sort(int array5,int n) /指定元素个数与指定元素个数与实参数组不同实参数组不同3. 用多维数组名作函数参数用多维数组名作函数参数如果用二维数组名作为实参和形参,在对形参数组如果用二维数组名作为实参和形参,在对形参数组声明时,声明时,必须指定第二维必须指定第二维(即列即列)的大小的大小,且应与实,且应与实参的第二维的大小相同。参的第二维的大小相同。第一维的大小可以指定,第一维的大小可以指定,也可以不指定。也可以不指定。如如int array310; /形参数组的两个维都指定形参数组的两个维都指定或或

31、 int array10; /第一维大小省略第一维大小省略在第二维大小相同的前提下,形参数组的第一维可以与实在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同。参数组不同。而形参数组可以声明为而形参数组可以声明为int array310; /列数与实参数组相同,行数不同列数与实参数组相同,行数不同int array810;系统不检查第一维的大小。系统不检查第一维的大小。如果是三维或更多维的数组,处理方法是类似的。如果是三维或更多维的数组,处理方法是类似的。用来存放字符数据的数组是字符数组,字符数组中用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。的一个元素存放一个

32、字符。字符数组具有数组的共字符数组具有数组的共同属性。由于字符串应用广泛,同属性。由于字符串应用广泛,c和和c+专门为它专门为它提供了许多方便的用法和函数。提供了许多方便的用法和函数。5.5 字符数组字符数组定义字符数组的方法与前面介绍的类似。定义字符数组的方法与前面介绍的类似。例如例如char c10;c0=i;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p; c9=y;上面定义了上面定义了c为字符数组,包含为字符数组,包含10个元素。在赋值个元素。在赋值以后数组的状态如图以后数组的状态如图5.7所示。所示。图图5.75.5.1 字符数组的定义和初始化字符数组

33、的定义和初始化对字符数组进行初始化,最容易理解的方式是逐个对字符数组进行初始化,最容易理解的方式是逐个字符赋给数组中各元素。如字符赋给数组中各元素。如char c10=i, ,a,m, ,h,a,p,p,y;把把10个字符分别赋给个字符分别赋给c0c9这这10个元素。个元素。如果如果花括号中提供的初值个数大于数组长度,则按花括号中提供的初值个数大于数组长度,则按语法错误处理。语法错误处理。如果如果初值个数小于数组长度,则只初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符。自动定为空字符。如果如果提供的初值个数与预定

34、的数提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。自动根据初值个数确定数组长度。只能对字符数组的元素赋值,而不能用赋值语句对只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值。整个数组赋值。如如char c5;c=c,h,i,n,a; /错误,不能对整个数组一次赋值错误,不能对整个数组一次赋值c0=c; c1=h;c2=i;c3=n;c4=a; /对数组元素赋值,对数组元素赋值,正确正确如果已定义了如果已定义了a和和b是具有相同类型和长度的数组,是具有相同类型和长度的数组,且且b数组已被初始化

35、,请分析:数组已被初始化,请分析: a=b; /错误,不能对整个数组整体赋值错误,不能对整个数组整体赋值a0=b0; /正确,引用数组元素正确,引用数组元素 5.5.2 字符数组的赋值与引用字符数组的赋值与引用例例5.9 设计和输出一个钻石图形。设计和输出一个钻石图形。 #include using namespace std;void main( )char diamond5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+)coutdiamondij; /逐个引用数组元素,每次输出一

36、个字符逐个引用数组元素,每次输出一个字符coutstr; /用字符数组名输入字符串用字符数组名输入字符串coutstr; /用字符数组名输出字符串用字符数组名输出字符串在运行时输入一个字符串,如在运行时输入一个字符串,如china 在内存中,数组在内存中,数组str的状态如图的状态如图5.9所示,在所示,在5个字符个字符的后面自动加了一个结束符的后面自动加了一个结束符0。5.5.4 字符数组的输入输出字符数组的输入输出图图5.9输出时,逐个输出字符直到遇结束符输出时,逐个输出字符直到遇结束符0,就停止,就停止输出。输出结果为输出。输出结果为china如前所述,如前所述,字符数组名字符数组名st

37、r代表字符数组第一个元代表字符数组第一个元素的地址,执行素的地址,执行“coutstr;”的过程是从的过程是从str所指向所指向的数组第一个元素开始逐个输出字符,直到遇到的数组第一个元素开始逐个输出字符,直到遇到0为止。为止。请注意:请注意:(1) 输出的字符不包括结束符输出的字符不包括结束符0。(2) 输出字符串时,输出字符串时,cout流中用字符数组名,而不流中用字符数组名,而不是数组元素名。是数组元素名。 (3) 如果数组长度大于字符串实际长度,也只输出如果数组长度大于字符串实际长度,也只输出到遇到遇0结束。结束。(4) 如果一个字符数组中包含一个以上如果一个字符数组中包含一个以上0,则

38、遇,则遇第一个第一个0时输出就结束。时输出就结束。(5) 用用cin从键盘向计算机输入一个字符串时,从键从键盘向计算机输入一个字符串时,从键盘输入的字符串应短于已定义的字符数组的长度,盘输入的字符串应短于已定义的字符数组的长度,否则会出现问题。否则会出现问题。由于字符串使用广泛,由于字符串使用广泛,c和和c+提供了一些字符串提供了一些字符串函数,使得用户能很方便地对字符串进行处理。几函数,使得用户能很方便地对字符串进行处理。几乎所有版本的乎所有版本的c+都提供下面这些函数,它们是放都提供下面这些函数,它们是放在函数库中的,在函数库中的,在在string和和string.h头文件中定义。头文件中

39、定义。如果程序中使用这些字符串函数,应该用如果程序中使用这些字符串函数,应该用#include命令把命令把string.h或或string头文件包含到本文件中。下头文件包含到本文件中。下面介绍几种常用的函数。面介绍几种常用的函数。5.5.5 字符串处理函数字符串处理函数1. 字符串连接函数字符串连接函数 strcat其函数原型为其函数原型为strcat(char,const char);strcat是是string catenate(字符串连接)的缩写。该(字符串连接)的缩写。该函数有两个字符数组的参数,函数有两个字符数组的参数,函数的作用是:将第函数的作用是:将第二个字符数组中的字符串连接到

40、前面字符数组的字二个字符数组中的字符串连接到前面字符数组的字符串的后面。符串的后面。第二个字符数组被指定为第二个字符数组被指定为const,以,以保证该数组中的保证该数组中的内容不会在函数调用期间修改内容不会在函数调用期间修改。连连接后的字符串放在第一个字符数组中,接后的字符串放在第一个字符数组中,函数调用后函数调用后得到的函数值,就是第一个字符数组的地址。例如得到的函数值,就是第一个字符数组的地址。例如char str130=peoples republic of ;char str2=china;cout字符串字符串2,函数值为一正整数。,函数值为一正整数。(3) 如果字符串如果字符串1s

41、tr2) cout0) coutyes;4. 字符串长度函数字符串长度函数strlen函数原型为函数原型为strlen(const char);strlen是是string length(字符串长度)的缩写。它是(字符串长度)的缩写。它是测试字符串长度的函数。其函数的值为字符串中的测试字符串长度的函数。其函数的值为字符串中的实际长度,实际长度,不包括不包括0在内在内。如如char str10=china;coutstrlen(str);输出结果不是输出结果不是10,也不是,也不是6,而是,而是5。以上是几种常用的字符串处理函数,除此之外还有以上是几种常用的字符串处理函数,除此之外还有其他一些函

42、数。其他一些函数。用字符数组来存放字符串并不是最理想和最安全的用字符数组来存放字符串并不是最理想和最安全的方法。方法。c+提供了一种新的数据类型提供了一种新的数据类型字符串类型字符串类型(string类型类型),在使用方法上,它和,在使用方法上,它和char、int类型类型一样,可以用来定义变量,这就是字符串变量一样,可以用来定义变量,这就是字符串变量用一个名字代表一个字符序列。用一个名字代表一个字符序列。实际上,实际上,string并不是并不是c+语言本身具有的语言本身具有的基本类基本类型型,它是在,它是在c+标准库中声明的一个字符串类,用标准库中声明的一个字符串类,用这种类可以定义对象。这

43、种类可以定义对象。每一个字符串变量都是每一个字符串变量都是string类的一个对象。类的一个对象。*5.6 c+处理字符串的方法处理字符串的方法字符串类字符串类与字符串变量与字符串变量1. 定义字符串变量定义字符串变量和其他类型变量一样,和其他类型变量一样,字符串变量必须先定义后使字符串变量必须先定义后使用,定义字符串变量要用类名用,定义字符串变量要用类名string。如。如string string1; /定义定义string1为字符串变量为字符串变量string string2=china; /定义定义string2同时对其初始化同时对其初始化应当注意应当注意: 要使用要使用string类

44、的功能时,必须在本文类的功能时,必须在本文件的开头将件的开头将c+标准库中的标准库中的string头文件包含进来,头文件包含进来,即应加上即应加上#include /注意头文件名不是注意头文件名不是string.h5.6.1 字符串变量的定义和引用字符串变量的定义和引用2. 对字符串变量的赋值对字符串变量的赋值在定义了字符串变量后,在定义了字符串变量后,可以用赋值语句对它赋予可以用赋值语句对它赋予一个字符串常量,一个字符串常量,如如string1=canada;既可以用字符串常量给字符串变量赋值,也可以用既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。一个字符

45、串变量给另一个字符串变量赋值。如如 string2=string1; /假设假设string2和和string1均已定义为字符串变量均已定义为字符串变量不要求不要求string2和和string1长度相同,长度相同,假如假如string2原来原来是是china,string1原来是原来是canada,赋值后,赋值后string2也变成也变成canada。在定义字符串变量时不在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变需指定长度,长度随其中的字符串长度而改变。可以对字符串变量中某一字符进行操作,可以对字符串变量中某一字符进行操作,如如 string word=then; /定义并初始化字符串变量定义并初始化字符串变量wordword2=a; /修改序号为修改序号为2的字符,修改后的字符,修改后word的值为的值为than3. 字符串变量的输入输出字符串变量的输入输出可以在输入输出语句中用字符串变量名,输入输出可以在输入输出语句中用字符串变量名,输入输出字符串字符串,如,如cin string1; /从键盘输入一个字符串给字符串变量从键盘输入一个字符串给字符串变量string1cout(大于大于)、=(大于或等于大于或等于)、=(小于或等于小于或等于)等关系运算等关系运算

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论