【文档说明】C语言程序设计-第6章--数组.ppt,共(53)页,1.111 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2222.html
以下为本文档部分文字说明:
第6章数组程序设计技术基础-C语言2022/11/122前几章使用的变量都属于基本类型,例如整型、字符型、浮点型数据,这些都是基本的数据类型。对于有些数据,只用简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。如果有1000
0名学生,每个学生有一个成绩,需要求这10000名学生的平均成绩。原有的基本数据类型就很难高效地完成这个任务。需要一种新的数据类型程序设计技术基础-C语言2022/11/12301要点一维数组定义、
初始化、引用、使用03要点02要点定义、初始化、引用、使用字符数组定义、初始化、引用、处理字符串、字符串处理函数、使用多维数组程序设计技术基础-C语言2022/11/1246.1一维数组6.1.1一维数组的定义6.1.2一维数组的初始化6.1.3一维数组成员的引用6.1.4一维数组的使
用6.1一维数组2022/11/1256.1.1一维数组的定义1.一维数组的定义一维数组的定义格式如下:类型说明符数组名[数组长度]例如,定义一个一维数组:intarray[6];array:5000Harray[0]5004Harray[1]5008Harray[2]500
CHarray[3]5010Harray[4]5014Harray[5]6.1一维数组2022/11/126•6.1.2一维数组的初始化如同变量的初始化一样,一维数组的初始化也是在定义一维数组时直接给其成员赋初值。否则数组中各成员的值将是随机的,不可预料的。1.一维数组初始化
格式一维数组初始化的格式为:类型说明符数组名[数组长度]={初值列表};例如对一个一维数组初始化:intarray[6]={1,2,3,4,5,6};经过上面的定义和初始化之后该数组的成员分别为:array[0]=1、array[1]=2、array[
2]=3、array[3]=4、array[4]=5、array[5]=6。6.1一维数组2022/11/1276.1.2一维数组的初始化2.一维数组初始化的几种情况(1)对一维数组全部成员都赋初值时,
数组长度可以缺省。系统将按照初值列表中的数值个数自动确定数组长度。例如:intarray[]={1,2,3,4,5,6};在上述过程中缺省了数组长度,但初值列表中有6个成员,因此系统自动确定该数组长度
为6。(2)当给出一维数组的数组长度时,可以在初值列表里列出部分成员的值。例如:intarray[6]={1,2,3};在初值列表中只列出了3个值,与其对应的是:array[0]=1、array[1]=
2、array[2]=3。对于剩余的成员array[3]~array[5],系统将自动为其填充初值为0。因此在定义数值类型的一维数组时只要在初值列表中给出一个初值,其后的成员就全部赋0值。例如:intarray[6]={0};
6.1一维数组2022/11/1286.1.3一维数组成员的引用一维数组定义后就可以使用了。由于C语言规定不能整体引用数组,所以只能逐个引用数组的成员。数组成员的表示的形式如下:数组名[下标]与数组定义中的数组长度不同,在对数组成员引用时,下标可以是整型常量、整型变量或整
型表达式。例如:array[0]、array[i]、array[2*i+1]在对数组成员进行引用时要注意下标从0开始,同时要避免混淆数组长度和下标区别而产生的越界问题。例如:floatscore[10];/
*定义一维数组长度为10*/b=score[5];/*引用score数组中下标为5的成员,既数组中的第6个成员*/w=score[10];/*引用score[10]越界,因为数组成员为score[0]~score[9]*/6.
1一维数组2022/11/129#include<stdio.h>intmain(){inti=0;/*初始化变量*/intarray[7]={0};/*初始化一维数组*/printf("Pleaseinpu
t7integers:\n");for(;i<7;i++)/*用循环结构给一维数组赋值*/scanf("%d",&array[i]);printf("\nThesequenceincomputeris:");for(i=0;i<7;i++)/*屏幕输出一维数组*/printf("
%d",array[i]);return0;}【例6-1】将数列{1,3,6,10,15,21,28}用一维数组存放,并在屏幕上显示。分析:数列由7个三角形数构成,因此可以用一个数组长度为7的一维数组存放。程序如下:程序运行的结果为:Pleas
einput7integers:13510152128Thesequenceincomputeris:135101521286.1一维数组2022/11/12106.1.4一维数组的使用【例6-2】求Fibonacci数列的前20项,并将结果用一维数组存储。分
析:按照Fibonacci数列的定义,首先使数组的前两项Fib[0]=Fib[1]=1,然后用公式Fib[i]=Fib[i-1]+Fib[i-2]求出数列的后续各项。算法如图6-2所示:6.1一维数组2022/11/1211#include<
stdio.h>intmain(){inti;intFib[20]={1,1};/*初始化,让数列前两项为Fib[0]=1,Fib[1]=1*/for(i=2;i<20;i++)Fib[i]=Fib[i-2]+F
ib[i-1];/*数列的递推公式*/for(i=0;i<20;i++){if(i%5==0)/*输出5列后换行*/printf("\n");printf("%12d",Fib[i]);}printf("\n");return0;}程序运行的结果为:1123581321345589144
23337761098715972584418167656.1一维数组2022/11/1212【例6-3】向一个有序序列中插入一个数,并保持序列有序。例如向序列{1,3,6,9,11}中插入5得到序列{1,3,5,6,9,11}。分析:首先需要定义一
个足够大的一维数组用于存放插入后的序列。其次,插入数值后,一维数组中,在插入位置后面的成员需要依次后移。算法如图6-3所示:6.1一维数组2022/11/1213#include<stdio.h>#defineN6intm
ain(){inti,j,x=5;intarray[N]={1,3,6,9,11};printf("Thesequencebeforeinserted:\n");for(i=0;i<N-1;i++)printf("
%3d",array[i]);for(i=0;i<N-1;i++)/*寻找插入位置i*/if(array[i]>x)break;for(j=4;j>=i;j--)/*插入位置后的数据依次后移*/array[j+1]=array[j];arra
y[i]=x;printf("\nThesequenceafterinserted:\n");for(i=0;i<N;i++)printf("%3d",array[i]);return0;}程序运行结果:Thesequencebeforeinserted:136911The
sequenceafterinserted:13569116.1一维数组2022/11/1214【例6-4】对给定的数列{5,2,3,4,1}用冒泡法按升序排序并在屏幕上输出结果。分析:冒泡法的思路是:将相邻数据两两依次比较
,按从小到大或从大到小顺序交换,一趟过去之后,最大或最小的数字被交换到了最后一位。再从头开始比较,直到倒数第二位。这里是把最大的数字往后交换,如图6-4所示:待排序列:52341第一趟:第一次两两比较交换
:25341第二次两两比较交换:23541第三次两两比较交换:23451第四次两两比较交换:2341[5]第二趟:经过三次比较交换:231[45]第三趟:经过两次比较交换:21[345]第四趟:经过一次比较交换:1[2345]完成排序:[12345]6.1
一维数组2022/11/1215#include<stdio.h>#defineN5/*定义数组时可用符号常量*/intmain(){inti,j,temp;intarray[N]={5,2,3,4,1};printf("Theseq
uencebeforesorted:\n");for(i=0;i<N;i++)printf("%3d",array[i]);printf("\n");for(i=0;i<N-1;i++)/*共需N-1趟*
/for(j=0;j<N-1-i;j++)/*每趟比较的次数为N-1-i*/if(array[j]>array[j+1])/*按升序交换*/{temp=array[j];array[j]=array[j
+1];array[j+1]=temp;}printf("Thesequenceaftersorted:\n");for(i=0;i<N;i++)printf("%3d",array[i]);printf("\n");return0;}程序运行的结果为:Thesequencebeforeso
rted:52341Thesequenceaftersorted:123456.1一维数组2022/11/1216【例6-5】从键盘接受5个整数,用选择排序法按升序排列并输出结果。分析:选择排序法的思路是:每
一次从无序组的数据成员中选出最小(或最大)的一个成员,把它和无序组的第一个成员交换,无序组成员减少,有序组成员增加,直到全部待排序的数据成员排完,如图6-6所示:待排序列:54123将5个数中最小的与第一个数对换:[1]45
23将剩余4个数中最小的与第二个数对换:[12]543将剩余3个数中最小的与第三个数对换:[123]45将剩余2个数中最小的与第四个数对换:[1234]5完成排序:[12345]6.1一维数组2022/11/1217#include<stdio.h>#define
N5intmain(){inti,j,temp,min=0;intarray[N];for(i=0;i<N;i++)/*本例题输入序列为{5,4,1,2,3}*/scanf("%d",&array[i]);printf("Thesequencebe
foresorted:\n");for(i=0;i<N;i++)printf("%3d",array[i]);for(i=0;i<N-1;i++){min=i;/*将min置成无序组起始位置成员下标*/for(j=i+1;j<N;j++)/*遍历无序组,找到
最小成员*/if(array[min]>array[j])min=j;if(min!=i)/*如果最小成员不是无序组起始位置成员,则与起始成员交换位置*/{temp=array[min];array[min]=array[i];array[i]=te
mp;}}printf("\nThesequenceaftersorted:\n");for(i=0;i<N;i++)printf("%3d",array[i]);printf("\n");return0;}程序运行结果:54123Theseq
uencebeforesorted:54123Thesequenceaftersorted:12345程序设计技术基础-C语言2022/11/12186.2多维数组6.2.1多维数组的定义6.2.2多维数组的初始化6.2.3多维数组成员的引用6.2.4多维
数组的使用6.2多维数组2022/11/12196.2.1多维数组的定义1.多维数组的定义多维数组的定义格式如下:类型说明符数组名[第1维长度][第2维长度]…[第n维长度];例:定义一个3×4的二维数组如下:intarr2[3][4];arr2[0][0]
arr2[0][1]arr2[0][2]arr2[0][3]arr2[1][0]arr2[1][1]arr2[1][2]arr2[1][3]arr2[2][0]arr2[2][1]arr2[2][2]arr2[2][3]arr2:
arr2[0][0]arr2[0][1]arr2[0][2]arr2[0][3]arr2+1:arr2[1][0]arr2[1][1]arr2[1][2]arr2[1][3]arr2+2:arr2[2]
[0]arr2[2][1]arr2[2][2]arr2[2][3]6.2多维数组2022/11/12206.2.2多维数组的初始化赋值时按“行优先”的顺序对数组成员依次赋值。其初始化的形式为:类型说明符数组名[第1维长度][第2维长
度]…[第n维长度]={初值列表};在初始化时有如下两种情况,以二维数组arr2[3][4]为例。1.将初值写在一个大括号内(1)对全部成员显式赋初值intarr2[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};此时,可省
略行下标,而不能省略列下标。如:intarr2[][4]={1,2,3,4,5,6,7,8,9,10,11,12};根据初值列表中所有数据为12个,而arr2每行为4列,系统会自动确定数组为3行。(2)对部分成员显式赋初值intarr2[3][4]={1,2,3};此初始化的结果
是arr2[0][0]=1,arr2[0][1]=2,arr2[0][2]=3。后面未被显式赋初值的9个成员,会被系统自动赋予0。6.2多维数组2022/11/12212.把初值按行分组(1)对全部成员显式赋初值intarr2[3][4]={{1,2,3,
4},{5,6,7,8},{9,10,11,12}};(2)对部分成员显式赋初值intarr2[3][4]={{1,2},{5,6},{9,10,11,12}};此初始化的结果是arr2[0][0]=1,a
rr2[0][1]=2,arr2[0][2]=0,arr2[0][3]=0,arr2[1][0]=5,arr2[1][1]=6,arr2[1][2]=0,arr2[1][3]=0,arr2[2][0]=9,arr2[2][1]=1
0,arr2[2][2]=11,arr2[2][3]=12。由于按行分组已经明确了行数,因此在此情况下可以缺省行下标,如:intarr2[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};intarr2[][4]={{1
,2},{5,6},{9,10,11,12}};这两个都是合法的。6.2多维数组2022/11/12223.二维以上数组的初始化可将二维数组的初始化方法推广到更高维的数组,如:(1)intarr3[2][3][4]={{{1,2,3,4},{5,6,7,8},{9
,10,11,12}},{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};(2)intarr3[][3][4]={{{1,2},{5},{9,10,11}},{{13},{17,18},{21
,22}}};(3)intarr3[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};(4)intarr3[][3][4]={1,2,3,4
,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};6.2多维数组2022/11/12236.2.3多维数组成员的引用1.多维数组成员的引用格式多维数组成员的引用在原则上与一维数组是相同的,主
要区别在下标的个数。如果定义的是一个n维数组,则此n维数组中成员的引用格式如下:数组名[下标1][下标2]…[下标n];需要注意的是在数组定义时,方括号中给出的是某一维的长度。而数组引用时,成员中的下标是该成员在数组中的
位置标识。2.二维数组成员的引用还是以二维数组为例对多维数组的引用做说明,如arr2[1][3]。在引用时需要注意以下几点:(1)数组成员在引用前必须先定义,例如:floatarr2[2][3];/*引用前必须定义*/arr2[0][2]=1.2;/*在定义后可以引用*/6.2多维数组
2022/11/1224(2)在引用数组成员时注意不要越界,例如:floatarr2[2][3];/*引用前必须定义*/arr2[2][3]=1.2;/*引用越界*/因为数组成员引用的下标是从0开始的,所以该数组中最后一个成员应该是arr2[1][2]。C语言在编译时不检查越界错误,但在
运行时会引起程序出错或导致错误结果。(3)成员的下标可以是整型变量或表达式。数组定义时的数组长度,只能是整型常量或整型常量表达式。而引用时,成员下标可以是整型常量、整型变量或整型表达式。例如,当i和j已定义为整型变量且已赋值,
则可用arr2[i-1][j+2]表达成员。注意:需要检查i-1和j+2的结果是否越界。6.2多维数组2022/11/12253.二维以上数组成员的引用二维以上数组成员的引用与二维数组类似,例如:定义了一个
三维数组:intarr3[3][4][5];则引用其成员arr3[1][0][2]并赋值的语句为:arr3[1][0][2]=89;6.2多维数组2022/11/12266.2.4多维数组的使用【例6-6】有一个3×3的整数矩阵A,分别求其主、副对角
线成员之和。789654321A#include<stdio.h>intmain(){intA[3][3]={1,2,3,4,5,6,9,8,7};/*对二维数组A初始化*/inti,j,sum1=0,sum2=0;for
(i=0;i<3;i++)for(j=0;j<3;j++){if(i==j)sum1+=A[i][j];/*主对角线的求和*/if(2==i+j)sum2+=A[i][j];/*副对角线的求和*/}for(i=0;
i<3;i++){for(j=0;j<3;j++)printf("%4d",A[i][j]);printf("\n");}printf("sum1=%d,sum2=%d\n",sum1,sum2);return0;}程序运行的结果为:123456987sum1=1
3,sum2=176.2多维数组2022/11/1227【例6-7】有一个2×3的整数矩阵A,求其转置矩阵,并将结果存到矩阵B中。654321A635241B6.2多维数组2022/11/1228#include
<stdio.h>intmain(){inti,j,B[3][2];intA[2][3]={{1,2,3},{4,5,6}};/*二维数组A的初始化赋值*/printf("数组A为:\n");for(i=0;i<2;i++){for(j=0;j<3;j++){printf("%5d",A[i][
j]);B[j][i]=A[i][j];/*矩阵转置的公式A(j,i)=B(i,j)*/}printf("\n");}printf("数组B为:\n");for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%5d",B[i]
[j]);printf("\n");}return0;}程序运行的结果为:数组A为:123456数组B为:1425366.2多维数组2022/11/1229【例6-8】三角阵是一种重要的矩阵。试把一个5×5的矩阵A,转换成一个下三角阵。25242322212019
181716151413121110987654321A10000670001112130016171819021222324256.2多维数组2022/11/1230#include<stdio
.h>intmain(){intA[5][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};/*二维数
组A的初始化*/printf("原矩阵为:\n");for(inti=0;i<5;i++){for(intj=0;j<5;j++)printf("%3d",A[i][j]);/*打印输出A矩阵的每一个元素*/printf("\n");}printf("三角阵为:\n");for(inti
=0;i<5;i++){for(intj=0;j<5;j++){if(i<j)A[i][j]=0;/*将A矩阵中i<j的元素值置为0*/printf("%3d",A[i][j]);/*打印输出三角阵中的每
一个元素*/}printf("\n");}return0;}程序运行的结果为:原矩阵为:12345678910111213141516171819202122232425三角阵为:10000670001112130016
171819021222324256.2多维数组2022/11/1231【例6-9】试输出以下图形:6.2多维数组2022/11/1232#include<stdio.h>intmain(){intA[6][6],i,j;for(i=0;
i<6;i++){for(j=0;j<6-i;j++){A[i][j]=1;/*满足i+j<=6的成员值置为1*/printf("%4d",A[i][j]);/*把等于1的成员输出*/}printf("\n");}return0;}程序运行的结果为:111
111111111111111111程序设计技术基础-C语言2022/11/12336.3字符数组6.3.1字符数组的定义6.3.2字符数组的初始化6.3.3字符数组成员的引用6.3.4字符数组处理
字符串6.3.5字符串处理函数6.3.6字符数组的使用6.3字符数组2022/11/12346.3.1字符数组的定义1.一维字符数组的定义char数组名[数组长度];例如:charlastname[10];2.二维字符数组的定义char数组名
[数组长度1][数组长度2];例如:charname2[3][8];如果要用到更高维度的数组形式,其定义与二维字符数组类似。字符型数据也可以使用整型数组来存储。但是,字符型数据只占用1个字节,显然使用整型型数组存储字符数据会浪费
空间,因此很少这样使用。6.3字符数组2022/11/12356.3.2字符数组的初始化1.对一维字符数组的初始化格式对一维字符数组的初始化采用如下格式:charlastname[5]={'L','i','a','n',
'g'};上述语句把5个字符分别赋给lastname[0]~lastname[4]这5个成员。字符数组定义的规则:(1)如果在定义字符数组时不进行初始化,则数组中各成员的值将是随机的,不可预料的。(2)如果花括号中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。
(3)如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些成员,其余的成员自动定为空字符(即'\0')。例如:charlastname[5]={'L','i','u'};6.3字符数组2022/11/
1236(4)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:charlastname[]={'Z','h','e','n','g'};数组lastname的长度自动定为5。2.对二维字符数组的初始化格式对二维
字符数组的初始化采用如下格式:(1)charname2[3][5]={{'Z','h','o','u'},{'W','u'},{'Z','h','e','n','g'}};(2)charname2[][5]={{'Z','h
','o','u'},{'W','u'},{'Z','h','e','n','g'}};(3)charname2[3][5]={'Z','h','o','u','\0','W','u','\0','\0','\0','Z','h','e','n','g'};(4
)charname2[][5]={'Z','h','o','u','\0','W','u','\0','\0','\0','Z','h','e','n','g'};其逻辑形式如图6-12所示。显然(3)、(4)不推荐。name2[0][1][2][3][4
][0]Zhou\0[1]Wu\0\0\0[2]Zheng6.3字符数组2022/11/12376.3.3字符数组成员的引用定义完一个字符数组后就可以对其成员进行引用,例如:(1)charlastnam
e[5];lastname[1]=’N’;(2)charname2[3][5];name2[1][2]=’m’;【例6-11】替换姓氏(姓氏的拼音)并输出。6.3字符数组2022/11/1238#in
clude<stdio.h>intmain(){inti;charlastname[]={'Z','h','e','n','g'};/*一维字符数组的初始化*/printf("要替换的姓:");for(i=0;i<5;i++)printf("%c",lastname[i])
;printf("\n");printf("请输入新的姓:");for(i=0;i<5;i++)scanf("%c",&lastname[i]);/*将新的姓存放到数组lastname中*/printf("替换后的姓:");for(i=0;i<5;i++)
printf("%c",lastname[i]);printf("\n");return0;}程序运行的结果为:要替换的姓:Zheng请输入新的姓:zhang替换后的姓:zhang6.3字符数组2022/11/1239【例6-12】用二维数组表示一组姓氏的拼音,并
输出。#include<stdio.h>intmain(){inti,j;charname2[3][5]={{'Z','h','o','u'},{'W','u'},{'Z','h','e','n','g'}};/*二维字符数组的初始化*/for(i=0;i<3;i++){for(j=0;j<
5;j++)printf("%c",name2[i][j]);printf("\n");}return0;}程序运行的结果为:ZhouWuZheng6.3字符数组2022/11/12406.3.4字符数组处理字符串1.字符串在字符数组中的形式字符串是指用双引号引起来的若
干有效字符的序列。在C语言中下面都是合法的字符串:"Happynewyear";"Cprogram!";"y=Ax+B";"sum*16";"%d%f\n"例如:charlastname[6]="Zheng";/*等价于charlastname[6]={"Zheng"}*/则数组成员的值为:la
stname[0]=‘Z’、lastname[1]=‘h’、lastname[2]=‘e’、lastname[3]=‘n’、lastname[4]=‘g’、lastname[5]=‘\0’6.3字符数组2022/11/12412.字符串结束符由于字符串后面隐含了字符’\0’。因此用字符
串初始化字符数组时,要特别注意数组长度的定义。如果charlastname[5]="Zheng";则会出现错误。字符‘\0’在字符串中叫串结束符是“字符串结束标志”。有了这个标志系统就可以自动计算字符串的长度。当然,在定
义字符数组时还是需要估计所要存放字符串的长度,保证数组长度始终大于等于字符串实际长度。如果在一个字符数组中存放的字符个数是变化的,应考虑最多字符的情况,数组长度在定义时选择一个最大值。如:charnam
e2[3][6]={"Zhou","Wu","Zheng"};在三个字符串中"Zheng"有6个字符,比其他两个长,所以数组第二维下标长度为6。数组形式如图6-13所示:name2[0][1][2][3][4][5][0]Zhou\0\0[1]Wu\0\0\0\0[2
]Zheng\06.3字符数组2022/11/12423.字符串的输入/输出对字符串的输入/输出,除了用“%c”外,还可以用“%s”,配合格式输出函数printf和格式输入函数scanf对字符串有效字符整体输入/输出。(1)用printf函数和“%s”格式输出字符串。例如
:将整个字符串一次输出:charlastname[]={"Zheng"};printf("%s",lastname);(2)用scanf函数和“%s”格式输入一个字符串。例如:从键盘输入字符串并赋给字符数组。charlastname[6];scanf("%s",las
tname);如果要用一个scanf函数输入多个字符串,则在输入时以空格或回车分隔。例如:charlastname1[6],lastname2[6],lastname3[6];scanf("%s%s%s"
,lastNamel,lastName2,lastName3);6.3字符数组2022/11/1243【例6-13】用格式%s的scanf函数给一个字符数组赋值。#include<stdio.h>intmain(){charlastname[16];
printf("给lastname输入字符串为:");scanf("%s",lastname);/*输入字符串*/printf("lastname中存储的字符串为:%s\n",lastname);return0;}
程序运行的结果为:给lastname输入字符串为:ZhouWuZhenglastname中存储的字符串为:Zhou6.3字符数组2022/11/1244(3)字符串输出函数putsputs函数的作用是将一个字符串输出到屏幕上。与printf不同,p
uts在输出字符串时,遇到’\0’后会自动加上换行。其调用形式为:puts(字符数组名)【例6-14】用puts函数输出的字符串中可以包含转义字符。#include<stdio.h>intmain(){charname2[]={"JackMa\nBillGates"};puts(name2);
/*输出字符串*/return0;}程序运行的结果为:JackMaBillGates6.3字符数组2022/11/1245(4)字符串输入函数gets不同于读取一个字符的函数getchar(),gets()函数用于从键盘缓
冲区中读取字符串,直到出现换行符,最后加上’\0’作为字符串结束。其调用形式为:gets(字符数组名)由于gets函数可以输入含有空格的字符串,所以这一点上比scanf函数要方便一些。例如:从键盘输入的字符串“LP,Qing”,并赋给字
符数组name2。回车是gets函数的输入结束标志。【例6-15】用gets和puts函数输入、输出字符数组中的字符串。#include<stdio.h>intmain(){charname2[16];gets(name2);/*输入字符串*/puts(name2);/*输出字符串*/retur
n0;}当输入LP,Qing↙后,程序执行的结果是:LP,QingLP,Qing需要注意的是:用puts和gets函数只能输出或输入一个字符串。例如:puts(lastname1,lastname2,lastname3)
;gets(lastname1,lastname2,lastname3);是不合法的。6.3字符数组2022/11/12466.3.5字符串处理函数#include<string.h>1.字符串复制函数strcpystrcpy函数用于字符串复制的函数,
其调用形式为:strcpy(字符数组1,字符串/字符数组2)该函数的作用是将字符串复制到字符数组1中去。需要注意的是strcpy中字符数组1的长度不应小于被复制的字符串的长度。此外,字符数组1必须写成数组名形式。例
如:charsl[10],s2[]=“Zheng”;strcpy(sl,s2);复制前后sl的状态如图6-14所示:复制前的s1??????????复制前的s2Zheng\0复制后的s1Zheng\0????复制后的s2Zheng\06.3字符数组2022/11/12
472.两个字符串的连接函数strcatstrcat是用于连接两个字符串的函数。其调用形式为:strcat(字符数组1,字符串/字符数组2)该函数的作用是把字符数组2中存放的字符串连接到字符数组l中存放的字符串的后面,连接的结果依然放在
字符数组1中,连接前,两个字符串的后面都有’\0’,连接时将字符数组1中的字符串后面的’\0’取消,然后进行连接。最后在连接组成的新串末尾保留’\0’。函数调用后返回的是字符数组1的地址,也就是新串保存在数组1中。例如:charsl[40]="Theteacher’snameis";char
s2[20]="HanLidou";printf("%s",strcat(sl,s2));输出结果为Theteacher’snameisHanLidou。6.3字符数组2022/11/12483.字符串比较函数strcmpstrcmp作用是比较字符串1和字符串2。其调用形式为:s
trcmp(字符串1/字符数组1,字符串2/字符数组2)strcmp(sl,s2);strcmp("UnitedStates","P.R.China");运行结果为1。strcmp(s,"Han");strcmp("Dou",s);其中,s、s1和s2是存放字符串的字符数组名。
字符串比较的规则是按自左至右的顺序对两个字符串的字符逐对比较字符的ASCII码值,直到出现不同的字符或遇到’\0’为止。当字符串1等于字符串2时,strcmp函数的返回值为0;当字符串1大于字符串2时,str
cmp函数的返回值为正整数;当字符串1小于字符串2时,strcmp函数的返回值负整数。注意:对两个字符串比较,不能用直接使用关系运算符连接字符串,如:sl>s2,要用strcmp(sl,s2)来判断两字符串的大小。6.3字符数组2022
/11/12494.测试字符串长度函数strlenstrlen函数用于测试字符串的长度。函数值为字符串中的有效字符的个数(不包括’\0’在内)。其调用形式为:strlen(字符串/字符数组)例如:charname[17]={"NingLiping"};pri
ntf("%d",strlen(name));运行结果为11strlen函数中的参数也可以是字符串常量。这样测量的就是该字符串的长度,例如:printf("%d",strlen("QingYuanyuan"));运行结果为13。6.3字符数组2022/11/12505.字
符串字母大小写转换函数(1)将字符串中的大写字母转换成小写字母的函数strlwr其调用形式为:strlwr(字符数组)例如:charname[]="Zheng"strlwr(name);运行结果为zheng。(2)将字符串中的小写字母转换成大写字母的函数strup
r其调用形式为:strupr(字符数组)例如:charname[]="Yuan"strupr(name);运行结果为YUAN。注意strlwr和strupr的参数只能是字符数组。字符串库函数并非C语言本身的组成部分,不同的编译系统提供的库函数数量、函数名以及函数功能都不尽相同。因此
使用时需要查一下该系统的库函数手册。6.3字符数组2022/11/12516.3.6字符数组的使用【例6-17】从键盘输入由5个字符组成的单词,判断此单词是不是water,并显示结果。分析:将输入单词的每个字符依次与water比较,只要有一个不同就中断比较,输出结论。算法如
图6-16所示:6.3字符数组2022/11/1252#include<stdio.h>intmain(){inti,flag;/*flag是判别用的标志位*/chars[]={'w','a','t','e','r'};charinput[5];for(i=0;i<5
;i++)scanf("%c",&input[i]);/*输入待判定的字符串*/flag=0;for(i=0;i<5;i++)if(s[i]!=input[i])/*如果输入的字符与原字符不等*/{flag=1;break;}if(flag)printf("Thi
swordisnotwater\n");elseprintf("Thiswordiswater\n");return0;}程序运行的结果为:douxyThiswordisnotwater程序设计技术基础-C语言2022/11/1253数组是C语言中十分重要和常用的
数据类型,用于对一批具有内在联系的同类数据进行处理。本章主要学习了一维数组、多维数组以及字符数组的定义、初始化及引用格式以及C语言相应的语法要求。另外,还对字符数组中的字符存储与字符串存储进行了比较,同时介绍
了字符串处理函数的使用。在此基础上对使用数组的一些常见算法进行了介绍。本章小结