《(精品)第六章数组指针与字符串.ppt》由会员分享,可在线阅读,更多相关《(精品)第六章数组指针与字符串.ppt(127页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章第六章 数组数组 指指针与字符串针与字符串阚忠良阚忠良阚忠良阚忠良本章主要内容数组指针动态存储分配指针与数组指针与函数字符串数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。数 组一维数组的声明与引用一维数组的声明类型说明符 数组名 常量表达式;例如:int a10;表示 a 为整型数组,有10个元素:a0.a9l引用引用必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组例如:a0=a5+a7-a2*3数组名的构成方法与一般变量名相同。数 组例6.1一维数组的声明与引用#include void main()int
2、 A10,B10;int i;for(i=0;i10;i+)Ai=i*2-1;B10-i-1=Ai;数 组 for(i=0;i10;i+)coutAi =Ai;cout Bi =Biendl;一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续的。例如:具有10个元素的数组 a,在内存中的存放次序如下:数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。a0 a1a2 a3 a4a5 a6 a7a8 a9a 数 组一维数组的初始化可以在编译阶段使数组得到初值:在声明数组时对数组元素赋以初值。例如:static int a10=0,1,2,3,4,5,6,7,8,9;可以只给一
3、部分元素赋初值。例如:static int a10=0,1,2,3,4;在对全部数组元素赋初值时,可以不指定数组长度。例如:static int a=1,2,3,4,5 数 组main()int i;static int f20=1,1;/*初始化第初始化第0、1个数个数*/for(i=2;i20;i+)fi=fi-2+fi-1;/*求第求第219个数个数*/for(i=0;i20;i+)/*输出,输出,每行每行5个数个数*/if(i%5=0)printf(n);printf(%12d,fi);例:用数组来处理求Fibonacci数列问题一维数组应用举例循环从键盘读入若干组选择题答案,计算并输
4、出每组答案的正确率,直到输入ctrl+z为止。每组连续输入5个答案,每个答案可以是a.d。数 组#include void main(void)char key =a,c,b,a,d;char c;int ques=0,numques=5,numcorrect=0;cout Enter the numques question tests:endl;while(cin.get(c)if(c!=n)if(c=keyques)numcorrect+;cout ;else cout *;else cout Score float(numcorrect)/numques*100%;ques=0;/re
5、set variables numcorrect=0;cout endl;continue;ques+;运行结果:acbba *Score 60%acbad Score 100%abbda*Score 40%bdcba*Score 0%二维数组的声明及引用数据类型 标识符常量表达式1常量表达式2;例:int a53;表表示示a为为整整型型二二维维数数组组,其其中中第第一一维维有有5个个下下标标(04),第第二二维维有有3个个下下标标(02),数数组组的的元元素素个个数数为为15,可可以以用用于于存存放放5行行3列列的的整整型型数数据据表表格。格。数 组存储顺序按行存放,上例中数组a的存储顺序为
6、:二维数组的声明类型说明符 数组名常量表达式常量表达式例如:float a34;a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23a0a00 a01 a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解为:引用例如:b12=a23/2下标不要越界下标不要越界下标不要越界下标不要越界二维数组的声明及引用 数 组分行给二维数组赋初值例如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;将所有数据写在一个内,按顺序赋值例如:static int a34=1,2,3,4,5,6,7,
7、8,9,10,11,12;可以对部分元素赋初值例如:static int a34=1,0,6,0,0,11;二维数组的初始化 数 组数组作为函数参数数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。数 组例6-2 使用数组名作为函数参数主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。数 组#include void RowSum(int A4,int nrow)int sum;for(int i=0;i
8、nrow;i+)sum=0;for(int j=0;j 4;j+)sum+=Aij;cout Sum of row i is sum endl;Ai0=sum;void main(void)int Table34=1,2,3,4,2,3,4,5,3,4,5,6;for(int i=0;i 3;i+)for(int j=0;j 4;j+)cout Tableij ;cout endl;RowSum(Table,3);for(int i=0;i 3;i+)cout Tablei0运行结果:1 2 3 42 3 4 53 4 5 6Sum of row 0 is 10Sum of row 1 is
9、14Sum of row 2 is 1810 14 18对象数组声明:类名 数组名元素个数;访问方法:通过下标访问 数组名下标.成员名 数 组对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:Point A2=Point(1,2),Point(3,4);如果没有为数组元素指定显式初始值,数组元素便使用缺省值初始化(调用缺省构造函数)。数 组数组元素所属类的构造函数不声明构造函数,则采用缺省构造函数。各元素对象的初值要求为相同的值时,可以声明具有缺省形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参(无缺省值)的构造函数。当数
10、组中每一个对象被删除时,系统都要调用一次析构函数。数 组例6-3 对象数组应用举例/Point.h#if!defined(_POINT_H)#define _POINT_Hclass Point public:Point();Point(int xx,int yy);Point();void Move(int x,int y);int GetX()return X;int GetY()return Y;private:int X,Y;#endif 数 组/6-2.cpp#include#include Point.hPoint:Point()X=Y=0;coutDefault Construc
11、tor called.endl;Point:Point(int xx,int yy)X=xx;Y=yy;cout Constructor called.endl;Point:Point()coutDestructor called.endl;void Point:Move(int x,int y)X=x;Y=y;#include#include Point.hint main()coutEntering main.endl;Point A2;for(int i=0;i2;i+)Ai.Move(i+10,i+20);coutExiting main.endl;return 0;运行结果:Ente
12、ring main.Default Constructor called.Default Constructor called.Exiting main.Destructor called.Destructor called.关于内存地址内存空间的访问方式通过变量名访问通过地址访问地址运算符:&例:int var;则&var 表示变量var在内存中的起始地址声明例:static int i;static int*i_pointer=&i;指向整型变量的指针概念指针:指针:另一个变量的地址,用于间接访问变量指针变量:指针变量:用于存放地址的变量20003i_pointer*i_pointeri2
13、000内存用户数据区变量 i变量 j变量 i_pointer362000200020043010引用例1:i=3;例2:*i_pointer=3;指 针l语法形式 存储类型 数据类型 *指针名初始地址;例:int*pa=&a;l注意事项用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。可以用一个已赋初值的指针去初始化另一 个指针变量。不要用一个内部非static变量的地址去初始化static 指针。指 针指针变量的赋值运算指针名=地址“地址”中存放的数据类型与指针类型必须相符。向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指
14、针。指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned long int型。允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。例:例:void*general;指 针例6-5 指针的声明、赋值与使用#includevoid main()int*i_pointer;/声明int型指针i_pointerint i;/声明int型数ii_pointer=&i;/取i的地址赋给i_pointeri=10;/int型数赋初值coutOutput int i=iendl;/输出int型数的值coutOutput int point
15、er i=*i_pointerendl;/输出int型指针所指地址的内容 指 针程序运行的结果是:Output int i=10Output int pointer i=10例6-6 void类型指针的使用void vobject;/错,不能声明void类型的变量void*pv;/可以声明void类型的指针int *pint;int i;void main()/void类型的函数没有返回值 pv=&i;/void类型指针指向整型变量 /void指针赋值给int指针需要类型强制转换:pint=(int*)pv;指 针指针变量的算术运算指针与整数的加减运算指针 p 加上或减去 n,其意义是指针当前
16、指向位置的前方或后方第 n 个数据的地址。这种运算的结果值取决于指针指向的数据类型。指针加一,减一运算指向下一个或前一个数据。例如:y=*px+相当于 y=*(px+)(*和+优先级相同,自右向左运算)指 针papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*papb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pb关系运算指向相同类型数据的指针之间可以进行各种关系运算。指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。指针可以和零之间进行等于或不等于的关系
17、运算。例如:p=0或p!=0赋值运算向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。指 针指向数组元素的指针声明与赋值例:int a10,*pa;pa=&a0;或 pa=a;通过指针引用数组元素经过上述声明及赋值后:*pa就是a0,*(pa+1)就是a1,.,*(pa+i)就是ai.ai,*(pa+i),*(a+i),pai都是等效的。不能写 a+,因为a是数组首地址是常量。指 针例6-7设有一个int型数组a,有10个元素。用三种方法输出各元素:使用数组名和下标使用数组名和指针运算使用指针变量 指 针main()int a10;int i;for(i=0
18、;iai;coutendl;for(i=0;i10;i+)coutai;使用数组名和下标main()int a10;int i;for(i=0;iai;coutendl;for(i=0;i10;i+)cout*(a+i);使用数组名指针运算使用指针变量main()int a10;int*p,i;for(i=0;iai;coutendl;for(p=a;p(a+10);p+)cout*p;指针数组数组的元素是指针型例:Point *pa2;由pa0,pa1两个指针组成 指 针例6-8 利用指针数组输出单位矩阵#include void main()int line1=1,0,0;/声明数组,矩阵
19、的第一行int line2=0,1,0;/声明数组,矩阵的第二行int line3=0,0,1;/声明数组,矩阵的第三行int*p_line3;/声明整型指针数组p_line0=line1;/初始化指针数组元素p_line1=line2;p_line2=line3;指 针/输出单位矩阵 coutMatrix test:endl;for(int i=0;i3;i+)/对指针数组元素循环 for(int j=0;j3;j+)/对矩阵每一行循环 coutp_lineij;coutendl;输出结果为:输出结果为:Matrix test:Matrix test:1,0,01,0,00,1,00,1,0
20、0,0,10,0,1例6-9 二维数组举例#include void main()int array223=11,12,13,21,22,23;for(int i=0;i2;i+)cout*(array2+i)endl;for(int j=0;j3;j+)cout*(*(array2+i)+j);coutendl;指 针在某次运行之后,程序的输出结果为:0X0065FDE011,12,130X0065FDEC21,22,23指针与常量 指向常量的指针不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。例:int n1=3;int const n2=5;const int*p
21、n=&n1;pn=&n2;/正确*pn=6;/错误 指 针指针与常量 指针常量若声明指针常量,则指针本身的值不能被改变。例:int n1=3;int const n2=5;int *const pn=&n1;pn=&n2;/错误*pn=6;/正确指针应用举例#include int main()int *pt_int;float*pt_float;int pig=7,dog=27;float x=1.2345,y=32.14;void*general;指 针 pt_int=&pig;*pt_int+=dog;cout Pig now has the value of *pt_int n;gen
22、eral=pt_int;/指向int型的指针赋值给void型指针 pt_float=&x;y+=5*(*pt_float);cout y now has the value of y n;general=pt_float;/指向float型的指针赋值给void型指针 const char*name1=John;/指向常量的指针,所指对象之值不能改变 char*const name2=John;/常量指针,指针本身不能被改变 return 0;运行结果:Pig now has the value of 34y now has the value of 38.3125指向常量的指针做形参#incl
23、udeconst int N=6;void print(const int*p,int n);void main()int arrayN;for(int i=0;iarrayi;print(array,N);指 针void print(const int*p,int n)cout*p;for(int i=1;in;i+)cout.*(p+i);coutendl;以指针作为函数参数以地址方式传递数据,可以用来返回函数处理结果。实参是数组名时形参可以是指针。指针与函数指针做函数参数举例#include#includePoint.h /Point 类声明略void f(Point *a,int n)
24、;int main()Point *pa2;/动态生成对象,其地址赋给指针数组元素 pa0=new Point(1,3);pa1=new Point(2,4);f(pa,2);delete pa0;delete pa1;return 0;指针与函数void f(Point *a,int n)/实参是指针数组,形参应使用二级指针/也可以写成 void f(Point *a,int n)for(int i=0;in;i+)coutGetX()endl;运行结果:Constructor called.Constructor called.12Destructor called.Destructor
25、called.例6.10题目:读入三个浮点数,将整数部分和小数部分分别输出#include void splitfloat(float x,int*intpart,float*fracpart)/形参intpart、fracpart是指针 *intpart=int(x);/取x的整数部分 *fracpart=x-*intpart;/取x的小数部分 指针与函数void main(void)int i,n;float x,f;cout Enter three(3)floating point numbers endl;for(i=0;i x;splitfloat(x,&n,&f);/变量地址做实参
26、cout Integer Part is n Fraction Part is f endl;运行结果:Enter three(3)floating point numbers 4.7Integer Part is 4 Fraction Part is 0.78.913Integer Part is 8 Fraction Part is 0.913-4.7518Integer Part is-4 Fraction Part is-0.7518例:输出数组元素的内容和地址(自己看)#include#include void Array_Ptr(long*P,int n)int i;cout In
27、 func,address of array is unsigned long(P)endl;cout Accessing array in the function using pointers endl;for(i=0;i n;i+)cout Address for index i is unsigned long(P+i);cout Value is *(P+i)endl;指针与函数void main(void)long list5=50,60,70,80,90;cout In main,address of array is unsigned long(list)endl;cout e
28、ndl;Array_Ptr(list,5);运行结果:In main,address of array is 6684132In func,address of array is 6684132Accessing array in the function using pointersAddress for index 0 is 6684132 Value is 50Address for index 1 is 6684136 Value is 60Address for index 2 is 6684140 Value is 70Address for index 3 is 6684144
29、Value is 80Address for index 4 is 6684148 Value is 90当函数的返回值是地址时,该函数就是指针形函数。声明形式 存储类型 数据类型 *函数名()指针与函数声明形式存储类型 数据类型 (*函数指针名)();含义:数据指针指向数据存储区,而函数指针指向的是程序代码存储区。指向函数的指针 指针与函数例6-11函数指针#include void print_stuff(float data_to_ignore);void print_message(float list_this_data);void print_float(float data_to
30、_print);void(*function_pointer)(float);int main()float pi=3.14159;float two_pi=2.0*pi;指针与函数 print_stuff(pi);function_pointer=print_stuff;function_pointer(pi);function_pointer=print_message;function_pointer(two_pi);function_pointer(13.0);function_pointer=print_float;function_pointer(pi);print_float(p
31、i);return 0;void print_stuff(float data_to_ignore)printf(This is the print stuff function.n);void print_message(float list_this_data)printf(The data to be listed is%fn,list_this_data);void print_float(float data_to_print)printf(The data to be printed is%fn,data_to_print);运行结果:This is the print stuff
32、 function.This is the print stuff function.The data to be listed is 6.283180 The data to be listed is 13.000000 The data to be printed is 3.141590 The data to be printed is 3.141590对象指针声明形式类名 *对象指针名;例Point A(5,10);Piont*ptr;ptr=&A;通过指针访问对象成员对象指针名-成员名 指 针例_对象指针应用举例 int main()Point A(5,10);Point*ptr;p
33、tr=&A;int x;x=ptr-GetX();coutxX=xx;this-Y=yy;指 针 指向类的非静态成员的指针通过指向成员的指针只能访问公有成员声明指向成员的指针声明指向公有数据成员的指针类型说明符 类名:*指针名;声明指向公有函数成员的指针类型说明符 (类名:*指针名)(参数表);指 针指向类的非静态成员的指针指向数据成员的指针说明指针应该指向哪个成员指针名=&类名:数据成员名;通过对象名(或对象指针)与成员指针结合来访问数据成员对象名.*类成员指针名或:对象指针名*类成员指针名 指 针 指向类的非静态成员的指针指向函数成员的指针初始化指针名=类名:函数成员名;通过对象名(或对象
34、指针)与成员指针结合来访问函数成员(对象名.*类成员指针名)(参数表)或:(对象指针名*类成员指针名)(参数表)指 针指向类的非静态成员的指针例6-13 访问对象的公有成员函数的不同方式void main()Point A(4,5);Point*p1=&A;int(Point:*p_GetX)()=Point:GetX;cout(A.*p_GetX)()endl;coutGetX)()endl;coutA.GetX()endl;指 针指向类的静态成员的指针对类的静态成员的访问不依赖于对象。可以用普通的指针来指向和访问静态成员。例6-14通过指针访问类的静态数据成员。例6-15通过指针访问类的静
35、态函数成员。指 针例6-14通过指针访问类的静态数据成员#include class Point public:Point(int xx=0,int yy=0)X=xx;Y=yy;countP+;Point(Point&p);int GetX()return X;int GetY()return Y;static int countP;private:int X,Y;Point:Point(Point&p)X=p.X;Y=p.Y;countP+;int Point:countP=0;指 针void main()int*count=&Point:countP;Point A(4,5);coutP
36、oint A,A.GetX(),A.GetY();cout Object id=*countendl;Point B(A);coutPoint B,B.GetX(),B.GetY();cout Object id=*countendl;例6-15通过指针访问类的静态函数成员#include class Point public:static void GetC()cout Object id=countPendl;private:int X,Y;static int countP;int Point:countP=0;指 针void main()void(*gc)()=Point:GetC;P
37、oint A(4,5);coutPoint A,A.GetX(),A.GetY();gc();Point B(A);coutPoint B,B.GetX(),B.GetY();gc();动态申请内存操作符 newnew 类型名T(初值列表)功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存。失败:0 NULL)动态存储分配释放内存操作符deletedelete 指针P功能:释放指针P所指向的内存。P必须是new操作的返回值。动态存储分配动态存储分配举例#include struct date int month;int d
38、ay;int year;动态存储分配int main()int index,*point1,*point2;point1=&index;*point1=77;point2=new int;*point2=173;cout The values are index *point1 *point2 n;delete point2;point1=new int;point2=point1;*point1=999;cout The values are index *point1 *point2 month=10;date_point-day=18;date_point-year=1938;cout
39、month /day /year n;delete date_point;/释放结构体 char*c_point;c_point=new char37;/动态分配数组 delete c_point;/释放数组 c_point=new charsizeof(date)+133;/动态分配数组 delete c_point;/释放数组 return 0;运行结果:The values are 77 77 173The values are 77 999 99910/18/1938动态分配数组时应注意(选修)用new创建多维数组:new 类型名T下标表达式1下标表达式2;如果内存申请成功,new运算
40、返回一个指向新分配内存首地址的指针,是一个T类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:char(*fp)3;fp=new char23;例6-16 动态创建对象举例#includeclass Point public:Point()X=Y=0;coutDefault Constructor called.n;Point(int xx,int yy);X=xx;Y=yy;cout Constructor called.n;Point()coutDestructor called.n;int GetX()return X;int GetY()return Y;void
41、Move(int x,int y)X=x;Y=y;private:int X,Y;动态存储分配int main()coutStep One:endl;Point*Ptr1=new Point;delete Ptr1;coutStep Two:endl;Ptr1=new Point(1,2);delete Ptr1;return 0;运行结果:运行结果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.例6-17动态创建对象数组举例#include
42、class Point /类的声明同例6-16,略;int main()Point*Ptr=new Point2;/创建对象数组Ptr0.Move(5,10);/通过指针访问数组元素的成员Ptr1.Move(15,20);/通过指针访问数组元素成员 coutDeleting.endl;delete Ptr;/删除整个对象数组 return 0;动态存储分配运行结果:Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.例6-19动态创建多维数组#inc
43、ludevoid main()float(*cp)98;int i,j,k;cp=new float898;for(i=0;i8;i+)for(j=0;j9;j+)for(k=0;k9;k+)*(*(*(cp+i)+j)+k)=i*100+j*10+k;/通过指针访问数组元素 动态存储分配for(i=0;i8;i+)for(j=0;j9;j+)for(k=0;k8;k+)/将指针cp作为数组名使用,/通过数组名和下标访问数组元素 coutcpijk ;coutendl;coutendl;动态存储分配函数void*malloc(size);参数size:欲分配的字节数返回值:成功,则返回void
44、型指针。失败,则返回空指针。头文件:和 malloc.h 动态存储分配动态内存释放函数void free(void*memblock);参数memblock:指针,指向需释放的内存。返回值:无头文件:和 动态存储分配浅拷贝与深拷贝(*)浅拷贝实现对象间数据元素的一一对应复制。深拷贝当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。浅拷贝与深拷贝例6-20对象的浅拷贝#includeclass Point /类的声明同例6-16 /;class ArrayOfPoints /类的声明同例6-18/;浅拷贝与深拷贝void main()int number;
45、cinnumber;ArrayOfPoints pointsArray1(number);pointsArray1.Element(0).Move(5,10);pointsArray1.Element(1).Move(15,20);ArrayOfPoints pointsArray2(pointsArray1);coutCopy of pointsArray1:endl;coutPoint_0 of array2:pointsArray2.Element(0).GetX(),pointsArray2.Element(0).GetY()endl;coutPoint_1 of array2:poi
46、ntsArray2.Element(1).GetX(),pointsArray2.Element(1).GetY()endl;pointsArray1.Element(0).Move(25,30);pointsArray1.Element(1).Move(35,40);coutAfter the moving of pointsArray1:endl;coutPoint_0 of array2:pointsArray2.Element(0).GetX(),pointsArray2.Element(0).GetY()endl;coutPoint_1 of array2:pointsArray2.
47、Element(1).GetX(),pointsArray2.Element(1).GetY()endl;运行结果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Copy of pointsArray1:Point_0 of array2:5,10Point_1 of array2:15,20After the moving of pointsArray1:Point_0 of array2:25,30Point_1 of array2:35,40Deleti
48、ng.Destructor called.Destructor called.Deleting.接下来程序出现异常,也就是运行错误。拷贝前拷贝后pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray1pointsnumberOfPointspointsArray1pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray2例6-21对象的深拷贝#includeclass Point /类的声明同例6-16 ;class ArrayOfPoints public:ArrayOfPoints(Arr
49、ayOfPoints&pointsArray);/其它成员同例6-18 ;浅拷贝与深拷贝ArrayOfPoints:ArrayOfPoints(ArrayOfPoints&pointsArray)numberOfPoints =pointsArray.numberOfPoints;points=new PointnumberOfPoints;for(int i=0;ip1;正确的:p1=abc;p2=a;cinp2;字符串字符串的输入/输出方法逐个字符输入输出将整个字符串一次输入或输出例:char c=China;coutstr1str2str3;运行时输入数据:How are you?内存中
50、变量状态如下:str1:H o w 0 str2:a r e 0 str3:y o u?0若改为:static char str13;cinstr;运行时输入数据:How are you?内存中变量 str 内容如下:str:H o w 0 整行输入字符串cin.getline(字符数组名St,字符个数N,结束符);功能:一次连续读入多个字符(可以包括空格),直到读满N个,或遇到指定的结束符(缺省为n)。读入的字符串存放于字符数组St中。读取但不存储结束符。cin.get(字符数组名St,字符个数N,结束符);功能:一次连续读入多个字符(可以包括空格),直到读满N个,或遇到指定的结束符(缺省为