1、给一组数排序,这组给一组数排序,这组 数该数该 如何存放呢如何存放呢82945637617188888888881111111111111118 8 88888888本章要点7.1 7.1 一维数组的定义和引用一维数组的定义和引用7.2 7.2 二维数组的定义和引用二维数组的定义和引用7.3 7.3 字符数组字符数组有如下几组数据,它们分别该如何存储呢?有如下几组数据,它们分别该如何存储呢? 是一组具有是一组具有相同数据类型相同数据类型的数据的的数据的有序集合。有序集合。 一个班学生的学习成绩 一行文字 一个矩阵这些数据的特点是:这些数据的特点是:1、具有相同的数据类型、具有相同的数据类型2、
2、使用过程中需要保留原始数据、使用过程中需要保留原始数据 C语言为这些数据,提供了一种语言为这些数据,提供了一种构造数据类型:数组。构造数据类型:数组。类型说明符类型说明符 数组名常量表达式;数组名常量表达式;例如:例如: int aint a1010; ; 它表示定义了一个整形数组,数组名为它表示定义了一个整形数组,数组名为a a,此数组,此数组有有1010个元素。个元素。 7.1.1 7.1.1一维数组的定义一维数组的定义(1 1)数组名定名规则和变量名相同,遵循标识符定名规则。(2 2)在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度。例如,指定a
3、10,表示a数组有10个元素,注意下标是从0开始的,这10个元素是,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。请持别注意,按上面的定义,不存在数组元素a10。(3 3)常量表达式中可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:int n;int n; scanf( scanf(“%d%d,&n); &n); / /* *在程序中临时输入数在程序中临时输入数 组的大小组的大小 * */ / int a int an n; ; float afloat a0 0;/
4、 /* * 数组大小为数组大小为0 0没有意义没有意义 * */ / int b(2)(3); int b(2)(3); / /* * 不能使用圆括号不能使用圆括号 * */ / int k, ak;int k, ak; / /* * 不能用变量说明数组大小不能用变量说明数组大小* */ / 每个数据元素占用每个数据元素占用的字节数,就是的字节数,就是基基类型类型的字节数的字节数一个元素占一个元素占4个个字节字节一维数组:一维数组: floatfloat markmark100;100;mark0mark1mark2mark3. . . .mark9986.592.077.552.0. . .
5、 .94.0低地址低地址 高地址高地址数组名下标数组名下标下标可以是整型常量或整型表达式。例如下标可以是整型常量或整型表达式。例如: :a a0 0=a=a5 5+a+a7 7-a-a2 2* *3 3定义数组时用到的“数组名常量表达式” 和引用数组元素时用到的“数组名下标” 是有区别的。例如 int a10; /* 定义数组长度为10 */ t=a6; /* 引用a数组中序号为6的元 素。此时6不代表数组长度 */ 7.1.2 7.1.2一维数组元素的引用一维数组元素的引用1 1、数组元素的引用方式:、数组元素的引用方式:2 2、一维数组元素引用的、一维数组元素引用的#include voi
6、d 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、对数组元素初始化的实现方法:对数组元素初始化的实现方法: (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=
7、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=0=0,0 0,0 0,0 0,0 0,0 0,0 0,0 0, 0 0,0; 0; 或或intainta1010=0;=0; 不不能写成能写成:int aint a1010=0=0* *10;10;这是与FORTRAN语言不同的,不能给数组整体赋初值。 2 2)可以只给一部分元素赋值。例如)可以只给一部分元素赋值。例如: :int ai
8、nt a1010=0=0,1 1,2 2,3 3,4;4; 定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。4 4)在对全部数组元素赋初值时,由于数据的个数已在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。经确定,因此可以不指定数组长度。 例如例如: :int aint a5 5=1=1,2 2,3 3,4 4,5;5; 也可以写成也可以写成 int a=1,2,3,4,5; 在第二种写法中,花括弧中有5个数,系统就会据此自动定义a数组的长度为5。但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如,想定义数组
9、长度为10,就不能省略数组长度的定义,而必须写成 int aint a1010=1=1,2 2,3 3,4 4,5; 5; 只初始化前5个元素,后5个元素为0。用数组来处理用数组来处理, ,求解求解Fibonacci数列。数列。#include #include void main()void main() int i; int i; int f int f2020=1=1,1;1;Fibonacci数列公式:数列公式:已知已知: : a a1 1=a=a2 2=1=1a an n=a=an-1n-1+a+an-2 n-2 即即:1,1,2,3,5,8,13:1,1,2,3,5,8,13 7.
10、1.4 7.1.4一维数组程序举例一维数组程序举例for(i=2;i20;i+)for(i=2;i20;i+)f fi i=f=fi-2i-2+f+fi-1i-1; ;for(i=0;i20;i+)for(i=0;i20;i+) if(i%5=0) printf( if(i%5=0) printf(n);n); printf(%12d printf(%12d,f fi i) ) / /* *ForFor循环结束循环结束* */ / / /* *程序结束程序结束* */ /运行结果如下:运行结果如下: 1 1 2 3 51 1 2 3 5 8 13 21 34 55 8 13 21 34 55
11、89 144 233 377 610 89 144 233 377 610 987 1597 2584 4181 6765 987 1597 2584 4181 6765if语句用来控制换行,每行输出5个数据。用起泡法对用起泡法对1010个数排序个数排序( (由小到大由小到大) )。 起泡法的思路是:起泡法的思路是:将相邻两个数比较,将小的调到前头。 第一趟比较 经过第一趟(共5次比较与交换)后,最大的数9已“沉底” 。然后进行对余下的前面5个数第二趟比较,注注第二趟比较如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。 经过第二趟
12、(共4次比较与交换)后,得到次大的数8。注注程序流程图如下:程序流程图如下:#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;i10;i+) scanf(%d,&ai); printf(n); for(j=0;j9;j+) for(i=0;iai+1) t=ai;ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n);/*程序结束*/程序运行结果如下:程序运行结果如
13、下:input 10 numbers:input 10 numbers:1 0 4 8 12 65 -76 100 -45 123the sorted numbers:the sorted numbers:-76 -45 0 1 4 8 12 65 100 123 7.2.1 7.2.1二维数组的定义二维数组的定义类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式;例如:例如:定义定义a a为为3 34(34(3行行4 4列列) )的数组,的数组,b b为为5 510(510(5行行1010列列) )的数组。如下:的数组。如下:float afloat a3 34 4,
14、b b5 51010;不能写成不能写成 float afloat a3 3,4 4,b b5 5,1010; ;注意注意我们可以把二维数组看作是一种特殊的一维数组:我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。它的元素又是一个一维数组。例如,可以把例如,可以把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素:a0、a1、a2,每个元素又是一个包含,每个元素又是一个包含4个元素的一维数组。个元素的一维数组。 二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素 b b0000b b0101b b0202b b101
15、0b 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多维数组多维数组如何定义呢?如何定义呢? 定义三维数组定义三维数组: float afloat a2 23 34 4; ;多维数组元素在内存中的排列顺序:第一维的下标变化多维数组元素在内存中的排列顺序:第一维的下标
16、变化最慢,最右边的下标变化最快。最慢,最右边的下标变化最快。 a000a000a001a001a002a002a003a003 a010 a010a011a011a012a012a013a013 a020a020a021a021a022a022a023a023 a100 a100a101a101a102a102a103a103 a110 a110a111a111a112a112a113a113 a120 a120a121a121a122a122a123a123三维数组的元素排列顺序三维数组的元素排列顺序二维数组元素的表示形式为:二维数组元素的表示形式为:数组名下标下标数组名下标下标 例如:例如
17、: a a2 23 3下标可以是整型表达式,下标可以是整型表达式,如如 a a2-12-12 2* *2-12-1数组元素可以出现在表达式中,也可以被赋值,例如:数组元素可以出现在表达式中,也可以被赋值,例如:b b1 12 2=a=a2 23 3/2/2注意注意不要写成不要写成 a a2 2,3 3,a a2-12-1,2 2* *2-12-1形式形式常出现的错误有:常出现的错误有: int a34; / /* * 定义定义a a为为3 34 4的数组的数组 * */ / a34=3; 在使用数组元素时,应该注意下标值应在已定义在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。的
18、数组大小的范围内。可以用下面可以用下面4 4种方法对二维数组初始化种方法对二维数组初始化数据类型数据类型 数组名数组名 常量表达式常量表达式1 1常量表达式常量表达式2 2 初始化数据初始化数据;(1)(1) 分行给二维数组赋初值。分行给二维数组赋初值。如:如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; (2)(2) 可以将所有数据写在一个花括弧内,按数组排列可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。的顺序对各元素赋初值。如:如:int aint a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010
19、,1111,12;12;(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 110 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)如果对全部元素都赋初值,则定义数组时对第一维如果对全部元素都赋
20、初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。的长度可以不指定,但第二维的长度不能省。如:如: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,7 7,8 8,9 9,1010,1111,12;12;在定义时也可以只对部分元素赋初值而省略第一维的在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:长度,但应分行赋初值。如:int aint a4 4=0=0,0 0,33,00
21、,10;10;0 0 3 00 0 0 00 10 0 0例例7.4 7.4 将一个二维数组行和列元素互换,存到另一个将一个二维数组行和列元素互换,存到另一个 二维数组中。二维数组中。#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) 例如:a= 1 2 3 1 4 4 5 6 b= 2 5 3 6 printf(%5d,aij); bji=aij; printf(n); printf(array b:n);for (i=0;i=2
22、;i+) for(j=0;j=1;j+) printf(%5d,bij); printf(n); / /* *程序结束程序结束* */ /运行结果如下:array a: 1 2 3 4 5 6array b: 1 4 2 5 3 6 例例7.5: 7.5: 有一个有一个34的矩阵,要求编程序求出其中值最大的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。的那个元素的值,以及其所在的行号和列号。 先用先用N-S流程图表示算法流程图表示算法 ,如下:如下:程序如下:程序如下: #include void main() int i,j,row=0,colum=0,max; in
23、t a34=1,2,3,4,9,8,7,6, -10,10,-5,2; max=a00; for (i=0;i=2;i+) for (j=0;jmax) max=aij; row=i; colum=j; printf(max=%d,row=%d,colum=%dn,max,row,colum); /*程序结束程序结束*/用来存放字符数据用来存放字符数据的数组是字符数组。的数组是字符数组。字符数组中的一个字符数组中的一个元素存放一个字符。元素存放一个字符。 7.3.1 7.3.1字符数组的定义字符数组的定义定义方法与前面介绍的类似。例如:定义方法与前面介绍的类似。例如:char cchar c1
24、010; ;c0=I;cc0=I;c1 1= ;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; 如果在定义字符数组时不进行初始化,则数组中各元如果在定义字符数组时不进行初始化,则数组中各元 素的值是不可预料的。素的值是不可预料的。如果花括弧中提供的初值个数如果花括弧中提供的
25、初值个数( (即字符个数即字符个数) )大于数组大于数组长度,则按语法错误处理。长度,则按语法错误处理。 7.3.2 7.3.2字符数组的初始化字符数组的初始化如果初值个数小于数组长度,则只将这些字符赋给数如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符组中前面那些元素,其余的元素自动定为空字符( (即即0)0)。例如:。例如: char cchar c1010=c=c, ,pp,rr,oo,gg,rr,aa,m; m; 如果提供的初值个数与预定的数组长度相同,在定义如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数
26、确定时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:数组长度。例如: char cchar c=I, ,a,m, ,h,=I, ,a,m, ,h,a,p,p,y;a,p,p,y;数组数组c c的长度自动定为的长度自动定为1010。 也可以定义和初始化一个二维字符数组。例如:也可以定义和初始化一个二维字符数组。例如: char diamondchar diamond5 55 5= = , ,* *, ,* *, ,* *,* *, , , ,* *, ,* *, ,* *, , ,* *例例7.6 输输出一个字符串。出一个字符串。 程序如下:程序如下:#include #inclu
27、de void main()void main() char c char c1010=I I, , , ,a a, ,m m, , , ,a a, , , , b b,o o,y;y; int i; int i; for(i=0;i10;i+) for(i=0;i10;i+) printf(%c printf(%c,c ci i);); printf( printf(n);n); 运行结果:运行结果:I am a boy I am a boy 例例7.7 7.7 输出一个钻石图形输出一个钻石图形 #include #include void main()void main() char di
28、amond char diamond5 5= , ,* *,* *, ,* *,* *, , , ,* *, ,* *, ,* *, , ,* *; int i int i,j;j; for (i=0;i5;i+) for (i=0;i5;i+) for (j=0;j5;j+) for (j=0;j5;j+) printf(%c printf(%c,diamonddiamondi ij j);); printf( printf(n);n); 运行结果运行结果 * * * * * * * 7.3.4 7.3.4字符串和字符串结束标志字符串和字符串结束标志为了测定字符串的实际长度,C C语言规定了
29、一个语言规定了一个“字符字符串结束标志串结束标志”,以字符,以字符00作为标志。作为标志。如果有一个字符串,前面9个字符都不是空字符(即0) ,而第10个字符是0,则此字符串的有效字符为9个。系统对字符串常量也自动加一个系统对字符串常量也自动加一个00作为结作为结束符。束符。00代表代表ASCIIASCII码为码为0 0的字符,从的字符,从ASCIIASCII码表中可以码表中可以查到,查到,ASCIIASCII码为码为0 0的字符不是一个可以显示的字符,的字符不是一个可以显示的字符,而是一个而是一个“空操作符空操作符”,即它什么也不干。用它来作,即它什么也不干。用它来作为字符串结束标志不会产生
30、附加的操作或增加有效字为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。符,只起一个供辨别的标志。可以用字符串常量来使字符数组初始化。例如 char c=I am happy;也可以省略花括弧,直接写成 char c=“I am happy; 它与下面的数组初始化等价char 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字符串和字符串结束标志字符串和字符串结束标
31、志需要说明的是需要说明的是:字符数组并不要求它的最后一个字符为0,甚至可以不包含0。例如:char cchar c5 5=C=C,hh,ii,nn,a;a;这样写完全是合法的。但是由于系统对字符串常量自动加一个0。因此,人们为了使处理方法一致,在字符数组中也常人为地加上一个0。如:char cchar c6 6=C=C,hh,ii,nn,aa,0;0;这样做,这样做是为了便于引用字符数组中的字符串。定义了以下的字符数组定义了以下的字符数组char cchar c=”Pascal programPascal program”;现在,想用一个新的字符串代替原有的字符串”Pascal program
32、” ,从键盘向字符数组输入HelloHello如果不加0的话,字符数组中的字符如下Hellol programHellol program例如例如 7.3.5 7.3.5字符数组的输入输出字符数组的输入输出 字符数组的输入输出可以有两种方法:字符数组的输入输出可以有两种方法: 逐个字符输入输出。用格式符逐个字符输入输出。用格式符“%c%c”输入或输出输入或输出一个字符。一个字符。 将整个字符串一次输入或输出。用将整个字符串一次输入或输出。用“%s%s”格式符,格式符,意思是对字符串的输入输出。意思是对字符串的输入输出。 char cchar c=China;=China;printf(%spr
33、intf(%s,c);c); 例如例如在内存中数组c的状态(1)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。如:写成下面这样是不对的:printf(%s,c0);(2)如果数组长度大于字符串实际长度,也只输出到遇0结束。(3)输出字符不包括结束符0。 如:char c10=China; /* 字符串长度为5,连0共占6个字节 */ printf(%s,c);只输出字符串的有效字符“China”,而不是输出10个字符。这就是用字符串结束标志的好处。说明说明(4)如果一个字符数组中包含一个以上0,则遇第一个0时输出就结束。(5)可以用scanf函数输入一
34、个字符串。 例如 scanf(%s,c); scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。例如,定义 char c6; 从键盘输入: China系统自动在China后面加一个0结束符。 说明说明如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。例如:char strlchar strl5 5,str2str25 5,str3str35 5; ;scanf(%s%s%sscanf(%s%s%s,str1str1,str2str2,str3);str3);输入数据:How are you? 数组中未被赋值的元素的值自动置0。若改为 char
35、 strchar str1313; ; scanf(%s scanf(%s,str);str);如果输入以下12个字符 How are you?How are you? 大家思考一下大家思考一下strstr1313数组中存放的结果会是什么呢?数组中存放的结果会是什么呢?由于系统把空格字符作为输入的字符串之间的分隔符,因此只将空格前的字符“How”送到str中。由于把“How”作为一个字符串处理,故在其后加0。分析图中所示的字符数组分析图中所示的字符数组用8进制形式输出数组c的起始地址 printf(%oprintf(%o,c);c); 输出数组c的起始地址2000。 printf(%sprin
36、tf(%s,c);c);按字符数组名c找到其数组起始地址,然后逐个输出其中的字符,直到遇0为止。 需要注意:scanf函数中的输入项如果字符数组名。不要再加地址符&,因为在C语言中数组名代表该数组的起始地址。下面写法不对:scanf(%sscanf(%s,&str)&str);在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C编译系统都提供这些函数。下面介绍几种常用的函数。 1. puts1. puts函数函数其一般形式为: puts (puts (字符数组字符数组) )其作用是将一个字符串其作用是将一个字符串(以以0结束的字结束的字符序列符序列)输出到终端。假如已定义输
37、出到终端。假如已定义str是一个字是一个字符数组名,且该数组已被初始化为符数组名,且该数组已被初始化为ChinaChina。则执行则执行puts(str);puts(str);其结果是在终端上输出其结果是在终端上输出ChinaChina。由于可以用printf函数输出字符串,因此puts函数用的不多。用用putsputs函数输出的字符串中可以包含转义字函数输出的字符串中可以包含转义字符。例如:符。例如:char str=ChinanBeijing;puts(str);输出结果:输出结果:ChinaBeijing 在输出时,将字符串在输出时,将字符串结束标志结束标志0转换成转换成n,即输出完字符
38、串后换行。即输出完字符串后换行。2. gets2. gets函数函数其一般形式为:其一般形式为:gets(gets(字符数组字符数组) )其作用是从终端输入一个字符串到字符数组,其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:的起始地址。如执行下面的函数:gets(str)gets(str)从键盘输入:Computer将输入的字符串将输入的字符串ComputerComputer送给字符数组送给字符数组strstr(请注意送给数组的共有(请注意送给数组的共有9 9个字符,而不是个字符,而不是8 8个
39、个字符),函数值为字符数组字符),函数值为字符数组strstr的起始地址。的起始地址。一般利用一般利用getsgets函数的目的是向字符数组输入一函数的目的是向字符数组输入一个字符串,而不大关心其函数值。个字符串,而不大关心其函数值。注意:注意:用puts和gets函数只能输入或输出一个字符串,不能写成puts(str1puts(str1,str2)str2) 或或 gets(str1gets(str1,str2)str2)3. strcat3. strcat函数函数其一般形式为其一般形式为:strcat(strcat(字符数组字符数组1 1,字符数组,字符数组2)2)Strcat的作用是连接
40、两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。例如:例如:char str130=Peoples Republic of ;char str2char str2=China;=China;print(%sprint(%s,strcat(str1strcat(str1,str2);str2); 输出:Peoples Republic of ChinaPeoples Republic of China 4. strcpy函数函数 其一般形式为其一般形式为:strcpy(字符数组字符数组1,字符串,字符串2) strcpy是“字
41、符串复制函数”。作用是将字符串2复制到字符数组1中去。例如:char str1char str11010,str2str2=China;=China;strcpy(str1,str2); 1.1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。 2.2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,China); 3.3.复制时连同字符串后面的0一起复制到字符数组1中。 4.4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(s
42、tr1,str2,2);作用是将str2中前面2个字符复制到str1中去,然后再加一个0。 5.5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的:str1=China;str1=China;str1=str2;str1=str2; 而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的:char achar a5 5,c1c1,c2;c2;c1=A; c2=B;c1=A; c2=B;a a0 0=C; a=C; a1 1=h; a=h; a2 2=i; =i; a a3 3=n
43、; a=n; a4 4=a;=a; 5. strcmp函数函数 其一般形式为其一般形式为:strcmp(字符串字符串1,字符串,字符串2) strcmp的作用是比较字符串1和字符串2。例如:例如:strcmp(str1,str2); strcmp(China,Korea); strcmp(str1,Beijing);AA,computercompare,36+54!$,CHINACANADA,DOG字符串2,函数值为一正整数。(3)(3) 如果字符串1str2) printf(yes);if(str1str2) printf(yes);而只能用if(strcmp(str1if(strcmp
44、(str1,str2)0) printf(yes);str2)0) printf(yes);6. strlen函数函数 其一般形式为其一般形式为:strlen (字符数组字符数组) strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括0在内)。如:char strchar str1010=China;=China; printf(%d printf(%d,strlen(str);strlen(str);输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(China); 7. strlwr函数函数 其一般形式为其一般形式为:strlwr (字符
45、串字符串) strlwr函数的作用是将字符串中大写字母换成小写字母。 8. strupr函数函数 其一般形式为其一般形式为:strupr (字符串字符串) strupr函数的作用是将字符串中小写字母换成大写字母。 以上介绍了常用的8种字符串处理函数,应当再次强调:库函数并非C语言本身的组成部分,而是C编译系统为方便用户使用而提供的公共函数。不同的编译系统提供的函数数量和函数名、函数功能都不尽相同,使用时要小心,必要时查一下库函数手册。 例例7 .8 7 .8 输入一行字符,统计其中有多少个单词,单输入一行字符,统计其中有多少个单词,单 词之间用空格分隔开。词之间用空格分隔开。程序如下:程序如下
46、: #include void main() char string81; int i,num=0,word=0; char c; gets(string); for (i=0;(c=stringi)!= 0;i+) if(c= ) word=0; else if(word=0) word=1; num+; printf(There are %d words in the line.n,num); 运行情况如下:I am a boy.There are 4 words in the line. 例例7.9 7.9 有有3 3个字符串个字符串, ,要求找出其中最大者要求找出其中最大者 程序如下程序如下: :#include#includevoid main ( ) char string20; char str320; int i; for (i=0;i0) strcpy(string,str0) else strcpy(string,str1);if (strcmp(str2,string)0) strcpy(string,str2);printf(nthe largest string is n%sn,string);运行结果如下:CHINAHOLLANDAMERICA the largest string isHOLLAND