版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章
数组与字符串一维数组、二维数组与字符串作者:目录01
一维数组02
二维数组03
字符数组与字符串01一维数组例如:#defineN5inta[10];//定义了有10个数据元素的int型数组afloatf[20];//定义了有20个数据元素的float型数组fcharstr1[10],str2[20];//定义了有10个和20个数据元素的char型数组str1和str2shortb[2*5+N];//定义了有15个数据元素的short型数组b一维数组的定义一维数组定义的一般形式如下:数据类型数组名[常量表达式];数组元素的数据类型数组变量的名称,必须是合法的标识符表示元素个数下标从0开始[]:数组运算符单目运算符左结合
不能用()用分号结尾一维数组的定义说明数组定义时,必须指定数组的大小(或长度),数组大小必须是整型常量表达式,不能是变量或变量表达式。(2)还可以定义多个数组,它们之间用逗号隔开。(3)数组中每个数组元素的类型均相同,它们占用内存中连续的存储单元,其中第一个数组元素的地址是整个数组所占内存块的低地址,也是数组所占内存块的首地址,最后一个数组元素的地址是整个数组所占内存块的高地址(末地址)。例如,下面对数组的定义是错误的:
intn=10;inta[n];//数组的大小不能是变量
intb[10.3];//数组的大小不能是浮点常量
intc[n+10];//数组的大小不能是变量表达式inta[3],b[3];//定义了两个整型数组,每个数组都有3个元素一维数组元素的引用
引用格式
数组名[下标]
引用说明(1)下标可以是整型常量、整型变量或整型表达式。C语言规定,下标的最小值是0,最大值则是数组大小减1。a[0]a[1]a[2]a[9]……内存地址2000200420082036a……第1个元素……第2个元素第3个元素第10个元素例:inta[10];
一维数组元素的引用
引用说明(2)只能逐个引用数组元素,不能一次引用整个数组。(3)数组定义以后,数组中的每一个元素其实就相当于一个变量,所以我们有时也把数组元素称为下标变量。对变量的一切操作同样也适合于数组元素。(4)数组必须先定义,后使用例
inta[10];printf("%d",a);(
)必须
for(j=0;j<10;j++)
printf("%d\t",a[j]);
(
)例:inta[3];a[0]=2;//将数组a的第1个元素赋值为2a[1]=4;//将数组a的第2个元素赋值为4a[2]=a[0]+a[1];//将数组a的第1个元素的值与第2个元素的值相加赋给第3个元素(值为6)
例
intx=a[1];//错误,应先定义数组a,再引用
inta[10];一维数组初始化(1)直接在定义数组时对数组元素进行赋初值
inta[6]={1,2,3,4,5,6};以上语句将数组中的元素值一次放在一对大括号中。经过上述定义和初始化后,数组中的元素a[0]的值为1,a[1]的值为2,以此类推,a[5]的值为6。数组的定义和初始化情况如5-1图所示。在进行一维数组的初始化时,需要为数组的每个元素赋值。以下是几种实现一维数组初始化的方法:一维数组初始化在进行一维数组的初始化时,需要为数组的每个元素赋值。以下是几种实现一维数组初始化的方法:(2)部分元素赋值,未赋值元素默认为
0。
inta[6]={1,2,3};在这个例子中,数组变量a包含6个元素,但只对前3个元素进行了赋值。因此,数组的前3个元素值为括号内给出的值,而未赋值的元素默认为0。数组的内存分配和初始化情况如图5-2所示。一维数组初始化(3)在不指定数组长度的情况下初始化全部数组元素。通常情况下,定义数组时需要在数组变量后指定数组的元素个数。然而,C语言也允许在定义数组时不必指定长度,例如:
inta[]={1,2,3,4};上述代码中,大括号中包含了4个元素,系统会根据给定的初始化元素值的个数来自动定义数组的长度,因此该数组变量a的长度为4。数组的内存分配和初始化情况如图5-3所示。在进行一维数组的初始化时,需要为数组的每个元素赋值。以下是几种实现一维数组初始化的方法:02二维数组二维数组的定义二维数组与一维数组不同,其下标包括两个维度。一般情况下,二维数组的定义形式如下:数据类型数组名[常量表达式1][常量表达式2];行数列数元素个数=行数*列数这里需要说明几点:●数据类型:数组中每个元素的数据类型,如int、float、char等;●数组名:该二维数组的名称,命名规则与变量一致,必须遵守定义标识符的命名规则;●[]是下标运算符,[]的个数代表了数组的维数,因此二维数组有两个[]下标;●数组的元素个数为常量表达式1和常量表达式2的乘积。例
inta[3][4];floatb[2][5];
intc[2][3][4];
inta[3,4];(
)
例intarr[3][4];二维数组的定义行名每个元素arr[i]由包含4个元素的一维数组组成二维数组arr是由3个元素组成014523arr[0][1]arr[0][2]arr[0][3]arr[1][0]arr[1][1]arr[0][0]arr[1][3]arr[2][0]arr[2][1]arr[2][2]arr[2][3]arr[1][2]67101189arr[0]arr[1]arr[2]二维数组的引用与一维数组类似,二维数组中的每个元素也可以像普通变量一样被引用,这就是二维数组元素的引用。二维数组元素的引用一般形式如下:数组名[行下标][列下标];在使用二维数组元素引用时,需要注意下标越界的问题。例如,对于一个定义为arr[2][3]的二维数组,如果引用元素为:arr[1][2];//引用arr数组中第2行第3列的元素例如,对一个二维数组的元素进行引用,代码如下:arr[2][3];(
)因为arr
数组是2行3列的数组,它的行下标的最大值为2,列下标的最大值为3。因此,arr[2][3]已经超出了数组的范围,造成了下标越界的错误。
二维数组初始化二维数组的初始化是为数组的每个元素赋初值。可以采用以下几种方法来实现二维数组的初始化:
数据类型数组名[常量表达式1][常量表达式2]=
{{第0行初值表},{第1行初值表},……,{最后1行初值表}};
分行初始化:
按元素排列顺序初始化
例:inta[2][3]={{1,2,3},{4,5,6}};
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]1 2 3 4 5 6对数组元素全部赋值例:inta[2][3]={{1},{3}};
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]1 0 0 3 0 0对数组元素部分赋值例:inta[][3]={{1,2},{4}};
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]1 2 0 4 0 0省掉第一维的大小数据类型数组名[常量表达式1][常量表达式2]={初值表};例:inta[2][3]={1,2,3,4,5,6};
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]1 2 3 4 5 6对数组元素全部赋值例:inta[2][3]={1,2,3};
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]1 2 3 0 0 0对数组元素部分赋值例:inta[][3]={1,2,3,4};
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]1 2 3 4 0 0省掉第一维的大小例5.2
实现杨辉三角形的输出每一行的首尾数字都是1,而中间的数字则是其上一行对应列的数字与上一行前一列的数字之和。假设使用数组y来存储杨辉三角形的值,那么可以得出这样的关系:程序代码:
#include<stdio.h> //包含头文件#defineN11 //定义常量intmain(){ //主函数maininti,j,y[N][N];//0行、0列不用for(i=1;i<N;i++){y[i][1]=y[i][i]=1;//第1列与对角线元素均为1for(j=2;j<=i-1;j++)//每一行从第2个元素开始 y[i][j]=y[i-1][j]+y[i-1][j-1]; //计算每个元素的值}for(i=1;i<N;i++){for(j=1;j<=i;j++){//每一行只要计算到对角线元素 printf("%4d",y[i][j]); //利用%4d的格式控制输出数据对齐} printf("\n");}return0;}
输出
11112113311464115101051y[i][j]=y[i-1][j]+y[i-1][j-1](当i>1且1<j≤i-1时)03字符数组与字符串字符数组的定义例:charstr[5];char数组名[常量表达式];char数组名[常量表达式1][常量表达式2];例:charstr[2][3];//定义了一个包含2行3列的二维字符数组字符数组的定义形式与一维数组、二维数组相同,唯一的区别是字符数组的类型声明固定为char。定义一维字符数组定义二维字符数组字符数组的引用例:str[4];数组名[下标];数组名[行下标][列下标];例:str[2][3];字符数组元素的引用与引用数值数组元素类似,也是将每个字符元素当成普通元素使用。一维字符数组引用二维字符数组引用字符数组的初始化
逐个字符赋值Hello逐个字符赋值str[0]str[1]str[2]str[3]str[4]例;charstr[5]={'H'
,'e'
,'l'
,'l'
,'o'
};Boy\0\0逐个字符赋值ch[0]ch[1]ch[2]ch[3]ch[4]例;charch[5]={
'B'
,'o'
,'y'
};用字符串常量
可省略数组长度Hello可省略数组长度str[0]str[1]str[2]str[3]str[4]例;charstr[]={'H'
,'e'
,'l'
,'l'
,'o'
};Boy\0\0用字符串常量str[0]str[1]str[2]str[3]str[4]例;charstr[5]=
"Boy";用字符串常量例;charstr[6]={
"Hello"
};charstr[6]="Hello"
;charstr[
]=
"Hello"
;Hell\0ostr[0]str[1]str[2]str[3]str[4]str[5]引用字符数组赋值例;charstr[5];str[0]='H';str[1]='e';str[2]='l';str[3]='l';str[4]='o';Hellostr[0]str[1]str[2]str[3]str[4]引用字符数组赋值判断下列赋值是否等价:charstr[]="china";
①charstr[]={'c','h','i','n','a','\0'};
②charstr[]={"china"};③charstr[]={'c','h','i','n','a'};
charstr[10]="china";①charstr[10]={'c','h','i','n','a'};注意:在用字符数组来存放某个字符串常量时,如果要指定字符数组的大小,那么其大小至少要比字符串的长度大1(多定义一个单元用于存放'\0')。字符串在C语言中,可以使用字符数组来保存字符串,即使用一个一维数组来存储字符串的每个字符。此时,系统会自动在字符数组的末尾添加一个“\0”(空字符)作为字符串的结束标志。低地址高地址'H''E''L''L''O''\0'字符串结束标志0x480x450x4C0x4C0x4F0字符串的本质字符串是一种以'\0'结尾的字符数组。如:字符串常量"HELLO"的内存映像字符数组的结束标记需要注意的是,使用字符串方式赋值会多占用一个字节,这个额外的字节用于存放字符串的结束标记“\0”。字符串字符数组的结束标记对字符数组进行初始化可以这样写:
charstr[]="Hello";
在C编译系统中,“\0”会自动加上。因此,上面的赋值语句也可以等价写为charstr[]={'H','e','l','l','o','\0'};
值得注意的是,初始化字符数组并不一定要求最后一个字符为“\0”,甚至可以不包含“\0”。例如,下面的写法也是合法的:charstr[]={'H','e','l','l','o'};
是否加上“\0”完全取决于实际需要。当然,为了方便测定字符串的实际长度以及在程序中做相应的处理,也可以加上一个“\0”。例如:charstr[6]={'H','e','l','l','o','\0'};字符串字符数组的输入和输出使用格式符"%c"进行逐个输入格式:scanf("%c",&str[i]);功能:逐个输入字符到字符数组中,然后在末尾加上字符串结束标志'\0’说明:输入串长度应小于字符数组维数例:charstr[6];inti;//变量i为循环的控制变量for(i=0;i<5;i++)//循环输入每个字符scanf("%c",&str[i]);str[i]='\0';//加上字符串结束标志'\0'
scanf("%c",
&str[i]);字符串字符数组的输入和输出使用格式符"%c"进行逐个输出格式:printf("%c",str[i]);功能:循环输出字符数组中的每个元素,直到遇到字符串结束标志为止('\0'不会被输出)例:charstr[6];str="hello";while(str[i]!='\0'){//循环输出printf("%c",str[i]);//输出字符数组元素i++;}
printf("%c",str[i]);字符串字符数组的输入和输出使用格式符"%s"进行整体输入格式:scanf(“%s”,字符数组名)
//应包含的.h文件为stdio.h
功能:从键盘输入一以空格或回车结束的字符串放入字符数组中,并自动
加'\0'说明:输入串长度应小于字符数组维数例:charstr[5];//初始化字符数组scanf("%s",str);//注意str前不能放&取地址符由于数组名代表数组的起始地址,因此在scanf()函数的字符数组名str前面不能加&,即不能写成&str字符串字符数组的输入和输出使用格式符"%s"进行整体输出格式:printf(“%s”,字符数组名)
//应包含的.h文件为stdio.h
功能:依次输出字符串中的每个字符直到遇到字符'\0'
('\0'不会被输出)例:charstr[]="HelloWorld";//初始化字符数组printf("%s",str);//输出字符串输出字符不包括结束符“\0”用“%s”格式输出时,printf的输出是str,而不是str[0]如果数组长度大于字符串实际长度,只输出到“\0”为止字符串字符数组的输入和输出使用格式符"%s"进行整体输出格式:printf(“%s”,字符数组名)
//应包含的.h文件为stdio.h
功能:依次输出字符串中的每个字符直到遇到字符'\0'
('\0'不会被输出)如果一个字符数组中包含多个“\0”结束字符,则在遇到第一个“\0”时输出就结束若要换行可借助转义字符'\n'实现例:charstr1[]="Howareyou?";charstr2[]="Iamfine.\nThankyou.";printf("%s%s",str1,str2);运行结果:Howareyou?Iamfine.Thankyou.字符串字符数组的输入和输出使用格式符"%s"进行整体输出格式:printf(“%s”,字符数组名)
//应包含的.h文件为stdio.h
功能:依次输出字符串中的每个字符直到遇到字符'\0'
('\0'不会被输出)例:
charname[]="JohnSmith";
printf("Thenameis:%s\n",name);
printf("Lastnameis:%s\n",&name[5]);
printf("Firstnameis:%s\n","John");输出结果:Thenameis:JohnSmithLastnameis:SmithFirstnameis:John字符串处理函数在C语言中,虽然没有直接提供字符串赋值、合并和比较的运算符,但是提供了一些标准函数来处理字符串,用户可以调用这些函数来进行各种操作。在本节中,我们将介绍几种常用的字符串处理函数,调用这些函数时,需要在程序的开头包含以下预处理头文件:#include<string.h>字符串处理函数格式:strcpy
(字符串1,字符串2)
//应包含的.h文件为string.h功能:将字符串2拷贝到字符串1中去返回值:返回字符串1的首地址说明:
字符串2可以是字符数组名、字符串常量。但字符串1必须是字符数组名拷贝时'\0'一同拷贝
字符串1必须定义足够大,以便容纳连接之后的字符串2字符串复制函数strcpy()例:
charstr[20];
strncpy(str,"0123456789",5);//将“0123456789”的前5个
字符复制到str中,并未加'\0'
str[5]='\0';//在末尾添加'\0'
printf("%s",str);//将输出01234字符串处理函数字符串连接函数strcat()格式:strcat
(字符串1,
字符串2)
//应包含的.h文件为string.h功能:把字符串2连到字符串1后面返值:返回字符串1的首地址说明:
字符串2可以是字符数组名、字符串常量。但字符串1必须是字符数组名
连接前,两串均以'\0'结束;连接后,串1的'\0'取消,新串最后
加'\0’
字符串1必须定义足够大,以便容纳连接之后的字符串2例:charstr1[20]="12345",str2[]="6789";
strcat
(str1,str2);
printf("%s",str1);//将输出123456789字符串处理函数字符串比较函数strcmp()格式:strcmp
(字符串1,
字符串2)
//应包含的.h文件为string.h功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或'\0'为止返值:返回int型整数。a.若字符串1<字符串2,返回负整数
b.若字符串1>字符串2,返回正整数
c.若字符串1==字符串2,返回零说明:字符串比较不能用“==”,必须用strcmp例:
strcmp("abcd","abCD");//将返回1;
strcmp("1234","12345");//将返回-1;
strcmp("hello","hello");//将返回0。
字符串处理函数求字符串长度函数strlen()格式:strlen(字符数组名)
//应包含的.h文件为string.h
功能:计算字符串长度返值:返回字符串实际长度,不包括'\0'在内例:
charstr[]="0123456789";
printf("%d",strlen(str));//输出结果为10
printf("%d",strlen(&str[5]));//输出结果为5问:
charstr[]="0123\0456789";
printf("%d",strlen(str));
printf("%d",strlen(&str[5]));//
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年医院设计投标流程及标准
- 村干部工作效率低下整改措施
- 中考生物复习生物与环境专项生态系统的自动调节能力题选汇编含答案
- 2026供热系统面试题目及答案
- 2026河东美术面试题及答案
- 试论物业企业税收筹划要点
- 2026江宁面试题目及答案
- 2026近期模拟面试题及答案
- 中考生物复习生物的多样性专项生物对环境的影响题选汇编含答案
- 新消防法考试题及答案
- 2026年哈尔滨市香坊区六年级下学期数学期末试题及答案0707
- 2026年邮政营业员(高级工)试题附答案
- 2026浙江省重点初中分班考夺分攻略:数学思维拓展与英语词汇飞跃专项训练
- 2026福建省农业融资担保有限公司招聘3人笔试备考题库及答案详解
- 抽水蓄能电站爆破施工方案
- 2026-2030中国钇行业运行现状与投资前景预测分析报告
- 2026年钛材行业分析报告及未来发展趋势报告
- 2026年重症肺炎的诊断与治疗
- 重卡维修站规范制度
- DZ∕T 0175-2014 煤田地质填图规范(1:50 000 1:25 000 1:10 000 1:5 000)(正式版)
- 大二下英语作文
评论
0/150
提交评论