版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章数组C语言程序设计第4章数组4.1.1一维数组的定义和初始化4.1.2一维数组元素的引用4.1一维数组第4章数组一维数组是一种用于存储一组相同类型数据的连续内存结构。定义一维数组时,需要指定数组的类型、名称以及元素的个数(可选)。在C语言中,使用数组必须先定义,一维数组定义的语法格式如下。typearray_name[size];其中,type:数组中每个元素的数据类型,例如int、float、char等。array_name:数组的名字,遵循变量命名规则。size:数组的大小,即数组中可以存储的元素个数。注意:size必须是常量或常量表达式。1.数组的基本特点数组的基本特点如下。(1)数组名的命名规则必须遵循标示符的命名规则,数组名不能与其他变量名相同。(2)数组必须使用方括号括起来,不用使用圆括号或其他括号。例如,下述数组定义都是不合法的。inta(10);inta{10};4.1一维数组4.1.1一维数组的定义和初始化第4章数组(3)数组的元素在内存中是连续存储的,数组中的元素用数组名和下标相结合来区分,数组的第一个元素的下标是0,最后一个元素的下标是size-1。如a[5]表示数组有5个元素,但是其下标从0开始,因此5个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]。例如,下述数组定义都是合法的。inta[5];//整型数组a,有5个元素floatb[10];//实型数组b,有10个元素charch[20];//字符数组ch,有20个元素(4)数组的大小在定义时确定,且无法动态改变(除非使用动态内存分配)。(5)单独使用数组名不能表示数组的某一个元素或所有元素。在C语言中,数组名等价于数组的首地址,也就是数组中第一个元素的地址,即“a”与“&a[0]”是等价的。4.1一维数组4.1.1一维数组的定义和初始化第4章数组(6)数组长度表示数组中元素个数,必须是整数,常用整型常量或整型常量表达式来表示,不能使用变量或含有变量的表达式。例如,下述数组定义都是合法的。#defineN10inta[N],b[N-5];intc['A'];定义数组a、数组b、数组c都是允许的。N是符号常量,数组a的长度为10;N-5是常量表达式,数组b的长度为5;'A'是字符常量,其ASCII码为65,所以数组c的长度为65。例如,下述数组定义是不合法的。intn=10;inta[n];n为变量,不能使用变量进行数组定义。4.1一维数组4.1.1一维数组的定义和初始化第4章数组【实例4.1】使用for循环初始化数组。
程序代码如下。#include<stdio.h>intmain(){intarr[5],i;for(i=0;i<5;i++){arr[i]=i+1;//初始化数组元素为1,2,3,4,5}printf("数组内容:");for(i=0;i<5;i++){printf("%d",arr[i]);}printf("\n");return0;}程序运行结果如下。数组内容:123454.1一维数组4.1.1一维数组的定义和初始化第4章数组【实例4.2】可以让用户通过输入来初始化数组。程序代码如下。
#include<stdio.h>intmain(){intarr[5],i;printf("请输入5个整数(以空格分隔):");for(i=0;i<5;i++){scanf("%d",&arr[i]);}printf("数组内容:");for(i=0;i<5;i++){printf("%d",arr[i]);}printf("\n");return0;}程序运行结果如下。请输入5个整数(以空格分隔):1020304050数组内容:10203040504.1一维数组4.1.1一维数组的定义和初始化第4章数组(3)字符串初始化。字符数组可以用字符串字面量初始化,注意末尾会自动添加“\0”(空字符)。charstr[6]="Hello";//等价于{'H','e','l','l','o','\0'}如果省略数组大小,编译器会根据字符串长度(包括“\0”)自动推导数组大小。charstr[]="Hello";//编译器推导出数组大小为6如果希望将数组的所有元素初始化为0,可以使用以下方法。intarr[5]={0};//所有元素都被初始化为0这是因为未显式初始化的部分会被自动初始化为0。一维数组的初始化方式灵活多样,可以根据需求选择合适的方法。无论是静态初始化还是动态赋值,都需要注意数组大小、边界条件以及初始化规则,以避免潜在的错误和未定义行为。4.1一维数组4.1.1一维数组的定义和初始化第4章数组一维数组元素的引用是通过使用数组名加上方括号内的索引来访问特定位置的元素。1.一维数组元素的引用语法格式数组元素是组成数组的基本单元,在定义数组并对其各元素赋值后,就可以引用数组中的元素,其标识方法为数组名后跟一个下标,下标表示了元素在数组中的顺序号,数组元素的引用语法格式如下。array_name[index]其中,array_name是数组的名字。index是要访问的元素的位置编号,从0开始计数。下标只能为整型常量或整型表达式,如a[10]、a[i+j]、a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,要输出5个元素的数组必须使用循环语句逐个输出各个下标变量。
for(i=0;i<5;i++){printf("%d",arr[i]);}4.1一维数组4.1.2一维数组元素的引用第4章数组4.1一维数组4.1.2一维数组元素的引用2.编程实现一维数组元素的引用【实例4.3】通过数组名和索引来实现一维数组元素的引用。程序代码如下。
#include<stdio.h>intmain(){//定义一个包含5个整数的一维数组
intarr[5]={10,20,30,40,50};//引用并打印数组中的元素
printf("第一个元素:%d\n",arr[0]);//索引为0,表示第一个元素
printf("第二个元素:%d\n",arr[1]);//索引为1,表示第二个元素
printf("第三个元素:%d\n",arr[2]);//索引为2,表示第三个元素
printf("第四个元素:%d\n",arr[3]);//索引为3,表示第四个元素
printf("第五个元素:%d\n",arr[4]);//索引为4,表示第五个元素
//修改数组中的某个元素
arr[2]=35;//将第三个元素修改为35printf("修改后的第三个元素:%d\n",arr[2]);return0;}程序运行结果如下。第一个元素:10第二个元素:20第三个元素:30第四个元素:40第五个元素:50修改后的第三个元素:35第4章数组4.1一维数组4.1.2一维数组元素的引用【实例4.5】使用冒泡排序算法,对从键盘输入的10个数值进行由小到大排序,并输出排序后的结果。(插入二维码V4-5使用冒泡排序算法)冒泡排序通过重复地遍历数组,每次比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置,每一轮会将当前未排序部分的最大值“冒泡”到数组的末尾。程序代码如下。#include<stdio.h>intmain(){intarr[10],i,j;//定义一个包含10个元素的一维数组
intn=10;//数组的大小
//提示用户输入10个数值
printf("请输入10个整数:\n");for(i=0;i<n;i++){scanf("%d",&arr[i]);//从键盘读取输入
}//冒泡排序算法
for(i=0;i<n-1;i++){//外层循环控制排序轮数
for(j=0;j<n-1-i;j++){//内层循环比较相邻元素
if(arr[j]>arr[j+1]){//如果前一个元素大于后一个元素
//交换两个元素的值
inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}//输出排序后的结果
printf("排序后的结果(由小到大):\n");for(i=0;i<n;i++){printf("%d",arr[i]);}printf("\n");return0;}第4章数组4.1一维数组4.1.2一维数组元素的引用程序运行结果如下。请输入10个整数:103050709080604020100排序后的结果(由小到大):102030405060708090100外层循环控制排序的轮数,共需要n-1轮。内层循环负责每一轮中的比较和交换操作。随着排序的进行,每次内层循环的范围会逐渐缩小(n-1-i),因为末尾的部分已经排好序。第4章数组4.1一维数组4.1.2一维数组元素的引用【实例4.6】从键盘输入10个数值为数组arr赋值,并输出数组arr中最大值与最小值。程序代码如下。
#include<stdio.h>intmain(){intarr[10],i;//定义一个包含10个元素的一维数组
intmax,min;//用于存储最大值和最小值
//提示用户输入10个整数
printf("请输入10个整数:\n");for(i=0;i<10;i++){scanf("%d",&arr[i]);//从键盘读取输入并赋值给数组
}//初始化最大值和最小值为数组的第一个元素
max=arr[0];min=arr[0];//遍历数组,寻找最大值和最小值
for(i=1;i<10;i++){if(arr[i]>max){//如果当前元素大于max,则更新maxmax=arr[i];}if(arr[i]<min){//如果当前元素小于min,则更新minmin=arr[i];}}//输出最大值和最小值
printf("数组中的最大值是:%d\n",max);printf("数组中的最小值是:%d\n",min);return0;}程序运行结果如下。请输入10个整数:103050709080406020100数组中的最大值是:100数组中的最小值是:10修改后的第三个元素:35第4章数组4.1一维数组4.1.2一维数组元素的引用【实例4.7】使用数组来处理和存储斐波那契数列(FibonacciSequence)的前30项,并按照每行5个数值的格式输出这些值,斐波那契数列的递推公式如下。程序代码如下。#include<stdio.h>intmain(){intfib[30],i;//定义一个包含30个元素的数组,用于存储斐波那契数列
//初始化斐波那契数列的前两项
fib[0]=0;//第1项
fib[1]=1;//第2项
//计算斐波那契数列的后续项
for(i=2;i<30;i++){fib[i]=fib[i-1]+fib[i-2];//当前项等于前两项之和
}//输出斐波那契数列的前30项,每行5个数值
printf("斐波那契数列的前30项:\n");for(i=0;i<30;i++){printf("%-12d",fib[i]);//左对齐,字符长度为12if((i+1)%5==0){//每输出5个数值换行
printf("\n");}}return0;}修改后的第三个元素:35第4章数组4.1一维数组4.1.2一维数组元素的引用程序运行结果如下。斐波那契数列的前30项:0112358132134558914423337761098715972584418167651094617711286574636875025121393196418317811514229第4章数组4.2.1二维数组的定义和初始化4.2.2二维数组元素的引用4.2二维数组第4章数组在C语言中,二维数组是一种用于存储数据的结构,可以将其看作是一个表格,其中数据按行和列排列。二维数组本质上是一个数组的数组,也就是说,它是由多个一维数组组成的。1.二维数组的语法格式在C语言中,使用数组必须先定义,二维数组定义的语法格式如下。typearray_name[size行数][size列数];其中,type:数组中每个元素的数据类型,例如int、float、char等。array_name:数组的名字,遵循变量命名规则。size:数组的大小,即数组中可以存储的元素个数。注意:size必须是常量或常量表达式。定义一个二维数组a,含有3行3列共9个元素,可以定义a[3][3]数组来表示,这9个元素表示如下。a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]二维数组中的每一个元素都有两个下标,都必须分别放在单独的方括号内。二维数组的行数和列数的乘积是该数组的元素个数。二维数组的存放规律是按行进行存储。如数组a含有3行3列共9个元素,则先存放a[0]行,再存放a[1]行、a[2]行,每行中的3个元素也是依次存放,所以数组元素排列顺序为a[0][0]→a[0][1]→a[0][2]→a[1][0]→a[1][1]→a[1][2]→a[2][0]→a[2][1]→a[2][2]。4.2二维数组4.2.1二维数组的定义和初始化第4章数组2.二维数组的初始化二维数组初始化是在类型说明时给各下标变量赋以初值,以数组元素的存储顺序为依据。(1)按行分段给二维数组赋初值。如对整数数组a[3][3],按行分段赋值,示例如下。inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号内的数据给第2行的元素,第3个花括号内的数据给第3行的元素,即按行分段进行赋初值。(2)按行连续赋值。可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值,示例如下。inta[3][3]={1,2,3,4,5,6,7,8,9};其效果与第(1)种一样,都可以进行赋值,但第(1)种方法较好,一行对应一行,界限清析。用第(2)种方法如果数组较大时,则会写成一大片,容易混乱,也不易检查。4.2二维数组4.2.1二维数组的定义和初始化第4章数组(3)二维数组部分赋初值。可以对二维数组进行部分赋初值,示例如下。inta[3][3]={{1},{4},{7}};其作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。赋初值后二维数组各元素如下:1 0 04 0 07 0 0也可以对各行中的某一个元素进行赋初值,示例如下。inta[3][3]={{1},{0,4},{5,7,9}};则初始化后的二维数组元素如下:1 0 00 4 05 7 9也可以对第2行不进行赋初值,示例如下。inta[3][3]={{1},{},{7}};则初始化后的二维数组元素如下:1 0 00 0 07 0 04.2二维数组4.2.1二维数组的定义和初始化第4章数组(4)二维数组全部赋初值。如果对全部二维数组都进行赋初值,则定义二维数组时对第1维数组的长度可以不指定,但第2维的长度不能省略,示例如下。inta[3][3]={1,2,3,4,5,6,7,8,9};与下面的定义方法等价:inta[0][3]={1,2,3,4,5,6,7,8,9};系统会根据元素总个数和第2维的长度算出第1维的长度,二维数组一共有9个元素,每行3列,可以确定行数为3。在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值,示例如下。inta[][3]={{0,0,3},{},{7,8}};这样系统编译后,可以得知数组共有3行,二维数组各元素为0 0 30 0 07 8 04.2二维数组4.2.1二维数组的定义和初始化第4章数组二维数组元素的引用是通过指定数组名和对应的行索引与列索引来实现的。1.二维数组元素的引用语法格式数组元素是组成数组的基本单元,在定义数组并对其各元素赋值后,就可以引用数组中的元素,其标识方法为数组名后跟行索引和列索引下标,行索引和列索引下标表示了元素在数组中的顺序号,二维数组元素的引用语法格式如下。array_name[行索引][列索引]其中,array_name是数组的名字。行索引和列索引都从0开始。行索引表示当前元素所在的行号。列索引表示当前元素所在的列号。4.2二维数组4.2.2二维数组元素的引用第4章数组2.编程实现二维数组元素的引用【实例4.8】通过数组名和索引来实现二维数组元素的引用。程序代码如下。#include<stdio.h>intmain(){inta[2][3]={{1,2,3},//第0行
{4,5,6}//第1行};printf("%d\n",a[0][0]);//输出第0行第0列的元素,结果为1printf("%d\n",a[0][1]);//输出第0行第1列的元素,结果为2printf("%d\n",a[0][2]);//输出第0行第2列的元素,结果为3printf("%d\n",a[1][0]);//输出第1行第0列的元素,结果为4printf("%d\n",a[1][1]);//输出第1行第1列的元素,结果为5printf("%d\n",a[1][2]);//输出第1行第2列的元素,结果为6return0;}4.2二维数组4.2.2二维数组元素的引用第4章数组【实例4.9】通过使用循环引用二维数组元素。程序代码如下。#include<stdio.h>intmain(){inti,j;inta[2][3]={{1,2,3},{4,5,6}};//遍历并引用每个元素
for(i=0;i<2;i++){//遍历行
for(j=0;j<3;j++){//遍历列
printf("a[%d][%d]=%d\n",i,j,a[i][j]);}}return0;}4.2二维数组4.2.2二维数组元素的引用第4章数组【实例4.10】实现从键盘输入一个2行3列的矩阵,并求出矩阵中的最大值和最小值。程序代码如下。#include<stdio.h>intmain(){inta[2][3];//定义一个2行3列的二维数组
inti,j;//用于循环变量
intmax,min;//用于存储最大值和最小值
//提示用户输入矩阵的数值
printf("请输入2行3列的矩阵元素(每行3个整数,以空格进行分隔):\n");for(i=0;i<2;i++){//遍历行
for(j=0;j<3;j++){//遍历列
scanf("%d",&a[i][j]);//输入每个元素
}}4.2二维数组4.2.2二维数组元素的引用第4章数组//初始化最大值和最小值为矩阵的第一个元素
max=a[0][0];min=a[0][0];//遍历矩阵,寻找最大值和最小值
for(i=0;i<2;i++){for(j=0;j<3;j++){if(a[i][j]>max){max=a[i][j];//更新最大值
}if(a[i][j]<min){min=a[i][j];//更新最小值
}}}//输出结果
printf("矩阵中的最大值是:%d\n",max);printf("矩阵中的最小值是:%d\n",min);return0;}4.2二维数组4.2.2二维数组元素的引用第4章数组【实例4.11】输出杨辉三角形(要求输出10行)。杨辉三角形生成规则如下。第一行只有一个元素,即1。对于除第一行外的所有行,第一个和最后一个数总是1。其他位置上的数等于其正上方的数加上左上方的数,即a[i][j]=a[i-1][j-1]+a[i-1][j]。程序代码如下。#include<stdio.h>intmain(){inti,j,k;//用于循环变量
introws=10;//输出10行杨辉三角
inta[10][10]={0};//定义一个10x10的二维数组,初始化为0//构造杨辉三角
for(i=0;i<rows;i++){for(j=0;j<=i;j++){if(j==0||j==i){a[i][j]=1;//每行的第一个和最后一个元素为1}else{a[i][j]=a[i-1][j-1]+a[i-1][j];//其他元素为上一行两个相邻元素之和
}}}4.2二维数组4.2.2二维数组元素的引用第4章数组
//打印杨辉三角
printf("杨辉三角(10行):\n");for(i=0;i<rows;i++){//打印每行前面的空格,使输出对齐成三角形
for(k=0;k<rows-i-1;k++){printf("");//每个空格占3个字符宽度
}for(j=0;j<=i;j++){printf("%6d",a[i][j]);//每个数字占6个字符宽度
}printf("\n");//每行结束后换行
}return0;}4.2二维数组4.2.2二维数组元素的引用第4章数组程序运行结果如下。杨辉三角(10行):
111121133114641151010511615201561172135352171182856705628811936841261268436914.2二维数组4.2.2二维数组元素的引用第4章数组【实例4.12】编程实现3×3矩阵的两条对角线上所有元素之和。程序代码如下。#include<stdio.h>intmain(){inta[3][3];//定义一个3x3的二维数组
intsum=0;//用于存储两条对角线元素之和
inti,j;//用于循环变量
//提示用户输入3x3矩阵的元素
printf("请输入3x3矩阵的元素(每行3个整数,以空格进行分隔):\n");for(i=0;i<3;i++){//遍历行
for(j=0;j<3;j++){//遍历列
scanf("%d",&a[i][j]);//输入每个元素
}}4.2二维数组4.2.2二维数组元素的引用第4章数组
//计算两条对角线上的元素之和
for(i=0;i<3;i++){sum+=a[i][i];//主对角线元素(行索引==列索引)
sum+=a[i][2-i];//副对角线元素(行索引+列索引==2)
}//如果是3x3矩阵,主对角线和副对角线会有一个交点(中心元素),需要减去一次
sum-=a[1][1];//减去重复计算的中心元素
//输出结果
printf("3x3矩阵的两条对角线上所有元素之和为:%d\n",sum);return0;}程序运行结果如下。请输入3x3矩阵的元素(每行3个整数,以空格进行分隔):1234567893x3矩阵的两条对角线上所有元素之和为:254.2二维数组4.2.2二维数组元素的引用第4章数组【实例4.13】编程实现2×3矩阵a的转置操作,并将结果存储到3×2矩阵b中。程序代码如下。#include<stdio.h>intmain(){inti,j;//用于循环变量
inta[2][3];//定义一个2x3的矩阵aintb[3][2];//定义一个3x2的矩阵b,用于存储转置后的结果
//提示用户输入2x3矩阵a的元素
printf("请输入2x3矩阵a的元素(每行3个整数,以空格进行分隔):\n");for(i=0;i<2;i++){//遍历矩阵a的行
for(j=0;j<3;j++){//遍历矩阵a的列
scanf("%d",&a[i][j]);//输入每个元素
}}//计算矩阵a的转置矩阵bfor(i=0;i<2;i++){//遍历矩阵a的行
for(j=0;j<3;j++){//遍历矩阵a的列
b[j][i]=a[i][j];//将矩阵a的行变为矩阵b的列
}}4.2二维数组4.2.2二维数组元素的引用第4章数组
//输出转置矩阵bprintf("转置后的矩阵b为:\n");for(i=0;i<3;i++){//遍历矩阵b的行
for(j=0;j<2;j++){//遍历矩阵b的列
printf("%d",b[i][j]);}printf("\n");//每行结束后换行
}return0;}程序运行结果如下。请输入2x3矩阵a的元素(每行3个整数,以空格进行分隔):102030405060转置后的矩阵b为:1040205030604.2二维数组4.2.2二维数组元素的引用第4章数组4.3.1字符数组的定义和初始化4.3.2字符数组元素的引用4.3.3字符串和字符串结束标志4.3.4字符数组的输入输出4.3.5字符串处理函数4.3字符数组与字符串第4章数组字符数组是一种用于存储字符数据的数组。它常用于处理字符串(即以“\0”结尾的字符序列)。字符数组是C语言中最基础的数据结构之一,广泛用于输入输出、字符串操作等场景。1.字符数组的定义字符数组与整型数组的数组元素是一个整数、实型数组的数组元素是一个实数一样,字符数组的数组元素是一个字符,字符数组中的每一个元素存放单个字符,分别占用一个存储单元。字符数组也分一维字符数组与二维字符数组。(1)一维字符数组。字符数组的定义与一维数组的定义格式相似,只是其数组元素的数据类型为字符型变量,其关键字为char。一维字符数组的定义语法格式如下。chararray_name[size];其中,char:定义数据类型为字符型。array_name:数组的名字,遵循变量命名规则。size:字符数组的大小,即字符数组中可以存储的元素个数。注意:size必须是常量或常量表达式。例如:chara[10];定义数组a为一个字符数组,可以存储10个字符型数据。4.3字符数组与字符串4.3.1字符数组的定义和初始化第4章数组(2)二维字符数组。二维字符数组的定义语言格式如下。chararray_name[size1][size2];其中,char:定义数据类型为字符型。array_name:数组的名字,遵循变量命名规则。size:字符数组的大小,即字符数组中可以存储的元素个数。注意:size必须是常量或常量表达式。例如:chara[10][20];定义数组a为一个二维字符数组,可以存储10个字符串数据。4.3字符数组与字符串4.3.1字符数组的定义和初始化第4章数组4.3字符数组与字符串4.3.1字符数组的定义和初始化第4章数组(3)若初值表中初值的个数等于字符数组的长度,可以在定义时,省略数组的长度,编译时系统会根据初值的个数确定数组的长度。(4)允许用字符串常量对字符数组进行初始化。例如,下面的初始化语句都是等价的。chara[5]={'H','e','l','l','o'};chara[]={'H','e','l','l','o'};chara[]={"Hello"};chara[]="Hello";但下面的用法都是错误的。chara[5]a="Hello";或者chara[5]a[5]="Hello";即不能在定义字符数组以后,再对数组名赋值。(5)若字符数组在定义时未进行初始化,则各元素的初值是不确定的,这一点与整型数组的规定是相同的。(6)二维字符数组的初始化方法与一维字符数组的初始化方法类似。例如:chara[2][20]={"TurboC","VisualC++"}4.3字符数组与字符串4.3.1字符数组的定义和初始化第4章数组在C语言中,字符数组是一种存储字符串或字符集合的常见方式。引用字符数组中的元素可以通过索引操作完成。1.字符数组元素的引用语法格式字符数组元素的引用语法格式如下。array_name[索引]其中,array_name是数组的名字,索引从0开始。2.编程实现字符数组元素的引用【实例4.14】通过索引引用字符数组元素。程序代码如下。#include<stdio.h>intmain(){charstr[]="Hello";//引用单个字符
printf("第一个字符:%c\n",str[0]);//输出'H'printf("第二个字符:%c\n",str[1]);//输出'e'printf("最后一个字符:%c\n",str[4]);//输出'o'return0;}4.3字符数组与字符串4.3.2字符数组元素的引用第4章数组【实例4.15】编程实现3×3矩阵的两条对角线上所有元素之和。程序代码如下。#include<stdio.h>intmain(){inti;charstr[]="Hello,World!";//定义并初始化一个字符数组
printf("字符数组的内容是:\n");for(i=0;str[i]!='\0';i++){//遍历字符数组直到遇到字符串结束符'\0'printf("%c",str[i]);//输出每个字符
}printf("\n");return0;}程序运行结果如下。字符数组的内容是:Hello,World!4.3字符数组与字符串4.3.2字符数组元素的引用第4章数组在C语言中,字符串是一种以字符数组形式存储的特殊数据结构。字符串的处理依赖于一个特殊的字符,即字符串结束标志('\0')。理解字符串和字符串结束标志是掌握C语言字符串操作的基础。1.字符串的定义字符串是由一系列字符组成的序列,并以一个特殊的字符'\0'结束。'\0'是ASCII码值为0的字符,表示字符串的结束。例如:charstr[]="Hello";实际存储的内容为:{'H','e','l','l','o','\0'}。字符串的有效部分为"Hello",不包括'\0'。'\0'是字符串的结束标志,用于告诉程序字符串在哪里结束。4.3字符数组与字符串4.3.3字符串和字符串结束标志第4章数组2.字符串的存储方式字符串在内存中是以字符数组的形式存储的,每个字符占用1个字节的空间,最后一个字符后会自动添加'\0'。例如:charstr[6]="Hello";在内存中的存储布局为:地址:|'H'|'e'|'l'|'l'|'o'|'\0'|索引:[0][1][2][3][4][5]4.3字符数组与字符串4.3.3字符串和字符串结束标志第4章数组3.字符串结束标志的作用(1)标记字符串的结束。在C语言中,字符串没有显式的长度信息,程序通过\0来判断字符串的结束位置。如果没有'\0',程序无法知道字符串在哪里结束,可能导致越界访问或错误结果。(2)影响字符串操作函数的行为。标准库中的字符串操作函数(如strlen、strcpy、strcat等)都依赖'\0'来正确处理字符串。例如:#include<stdio.h>intmain(){charstr[6]={'H','e','l','l','o'};//没有显式添加'\0'printf("%s\n",str);//输出可能是未定义行为
return0;}如果字符数组中没有'\0',printf()函数可能会继续读取内存中的其他内容,直到遇到'\0'。4.字符串与字符数组的区别字符数组是一个普通的数组,可以存储任意字符,不一定以'\0'结尾。字符串是一个特殊的字符数组,必须以'\0'结尾。4.3字符数组与字符串4.3.3字符串和字符串结束标志第4章数组字符数组通常用于存储字符串(以'\0'结尾的字符序列)。字符数组的输入与输出是编程中非常常见的操作。1.字符数组的输入输出方法字符数组的输入输出可以有两种方法。(1)逐个字符输入输出,可以使用格式符“%c”,输入或输出一个字符。(2)将整个字符串一次输入输出,可以使用格式符“%s”,输入或输出一个字符串。例如:chara[]={"China"};printf("%s\n",a);在内存中数组a的存储情况为4.3字符数组与字符串4.3.4字符数组的输入输出第4章数组2.字符数组的输入输出规则字符数组的输入输出规则如下。(1)使用“%s”格式符输出字符串时,printf()函数中的输出项是字符数组名,而不是数组元素名。写成下面这样是错误的。printf("%s",a[0]);(2)使用printf()函数输出时,如果数组长度大于字符串的实际长度,也只输出到遇'\0'结束。例如:chara[10]={"China"};printf("%s\n",a);只输出字符串的有效字符“China”,而不是输出10个字符,这就是用字符串结束标志的好处。(3)输出的字符串中不包括结束符'\0'。如果一个字符数组中包含一个以上'\0',则遇到第一个'\0'时输出就结束。(4)可以使用scanf()函数输入一个字符串。例如:scanf("%s",a);scanf()函数中的输入项a是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。4.3字符数组与字符串4.3.4字符数组的输入输出第4章数组如果利用一个scanf()函数输入多个字符串,则应输入时以空格进行分隔。例如:charstr1[8],str2[8];scanf("%s%s",str1,str2);输入数据:HelloWorld!由于有空格字符进行分隔,作为2个字符串输入。在输入完成后,str1和str2数组的状态如下:数组中未被赋值的元素自动置'\0'。注意:scanf()函数中的输入项如果是字符数组名,则不要再加地址符“&”,因为在C语言中数组名代表该数组第一个元素的地址(或者说是数组的起始地址)。下面的写法是错误的:scanf("%s",&str);//str前面不应加&4.3字符数组与字符串4.3.4字符数组的输入输出第4章数组在C语言中,字符串处理是编程中非常常见的任务。为了方便操作字符串,C标准库(<string.h>)提供了一系列的字符串处理函数。这些函数可以帮助我们完成诸如字符串复制、连接、比较、查找等操作。1.输出字符串puts()函数输出字符串puts()函数语法格式如下。puts(字符数组);其作用输出字符串到标准输出设备,即在屏幕显示该字符串。【实例4.16】使用puts()函数简单输出字符串。程序代码如下。#include<stdio.h>intmain(){charstr[]="Helloeveryone,\nWelcometohere!";puts(str);//输出字符串并自动换行
return0;}程序运行结果如下。Helloeveryone,Welcometohere!从程序中可以看出,put()函数中可以使用转义字符,因此输出结果成为两行。在使用puts()函数输出时,将字符串结束标志'\0'转换成'\n',即输出完字符串后换行。4.3字符数组与字符串4.3.5字符串处理函数第4章数组【实例4.17】编写程序实现对比puts()函数和printf()函数。程序代码如下。#include<stdio.h>intmain(){charstr[]="Hello,World!";printf("使用printf()函数输出:");printf("%s",str);//不会自动换行
puts("\n使用puts()函数输出:");puts(str);//自动换行
return0;}程序运行结果如下。使用printf()函数输出:Hello,World!使用puts()函数输出:Hello,World!可以看出puts()函数会自动添加换行符,而printf()函数则不会自动添加换行符。4.3字符数组与字符串4.3.5字符串处理函数第4章数组2.输入字符串gets()函数输入字符串gets()函数语法格式如下。gets(字符数组);其作用从标准输入(通常是键盘)读取字符串的函数(包括空格),直到遇到换行符“\n”或文件结束符EOF。它可以读取一行输入,并将其存储到字符数组中,最后添加字符串结束符'\0'。【实例4.18】使用gets()函数简单输入字符串。程序代码如下。#include<stdio.h>intmain(){charstr[100];printf("请输入一个字符串:");gets(str);//读取一行字符串
printf("你输入的字符串是:%s\n",str);return0;}程序运行结果如下。请输入一个字符串:Hello,Welcometohere!你输入的字符串是:Hello,Welcometohere!4.3字符数组与字符串4.3.5字符串处理函数第4章数组3.字符串复制strcpy()函数与strncpy()函数字符串复制strcpy()函数语法格式如下。strcpy(字符串1,字符串2);其作用将字符串2复制到字符串1中。strcpy()函数不检查目标数组的大小,容易导致安全隐患。字符串1必须有足够的空间,以容纳字符串2的内容及其结束符'\0'。【实例4.19】使用strcpy()函数复制字符串。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charsrc[]="Hello,World!";chardest[50];//确保目标数组足够大
strcpy(dest,src);//复制字符串
printf("复制后的字符串:%s\n",dest);return0;}程序运行结果如下。复制后的字符串:Hello,World!字符串复制strncpy()函数语法格式如下。strncpy(字符串1,字符串2,n);其作用将字符串2的前n个字符复制到字符串1中。字符串1必须有足够的空间,以容纳字符串2的内容及其结束符'\0'。如果源字符串的长度小于n,则会用'\0'填充剩余的空间。如果源字符串的长度大于或等于n,不会自动添加结束符'\0'。4.3字符数组与字符串4.3.5字符串处理函数第4章数组【实例4.20】使用strncpy()函数复制字符串。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charsrc[]="Hello,World!";chardest[50];strncpy(dest,src,5);//只复制前5个字符
dest[5]='\0';//手动添加结束符
printf("部分复制后的字符串:%s\n",dest);return0;}程序运行结果如下。部分复制后的字符串:Hello4.3字符数组与字符串4.3.5字符串处理函数第4章数组4.字符串连接strcat()函数与strncat()函数字符串连接strcat()函数语法格式如下。strcat(字符串1,字符串2);其作用是把两个字符串连接在一起,把字符串2接到字符串1的后面,结果放在字符数组1中。字符串1必须有足够的空间,以容纳字符串2的内容及其结束符'\0'。【实例4.21】使用strcat()函数连接两个字符串。程序代码如下。#include<stdio.h>#include<string.h>intmain(){chardest[50]="Hello";//目标字符串,确保有足够的空间
charsrc[]=",World!";//源字符串
strcat(dest,src);//将src追加到dest的末尾
printf("连接后的字符串:%s\n",dest);return0;}程序运行结果如下。连接后的字符串:Hello,World!4.3字符数组与字符串4.3.5字符串处理函数第4章数组字符串连接strncat()函数语法格式如下。strncat(字符串1,字符串2,n);其作用是把两个字符串连接在一起,把字符串2中的前n个字符连接到字符串1的后面,结果放在字符数组1中。字符串1必须有足够的空间,以容纳字符串2的内容及其自动在追加完成后添加结束符'\0'。【实例4.22】使用strncat()函数连接两个字符串。程序代码如下。#include<stdio.h>#include<string.h>intmain(){chardest[20]="Hello";//目标字符串
charsrc[]=",World!";//源字符串
strncat(dest,src,5);//最多追加5个字符
printf("部分连接后的字符串:%s\n",dest);return0;}程序运行结果如下。部分连接后的字符串:Hello,Wor4.3字符数组与字符串4.3.5字符串处理函数第4章数组5.字符串比较strcmp()函数与strcmp()函数字符串比较strcmp()函数语法格式如下。strcmp(字符串1,字符串2);其作用用于字符串比较的函数。它通过逐个字符比较两个字符串的内容,判断它们是否相等或大小关系。按照字典顺序(ASCII值)逐个字符比较,直到遇到不同的字符或字符串结束符'\0'。比较ASCII值:如果str1[i]<str2[i],则返回负数。如果str1[i]>str2[i],则返回正数。如果所有字符相同且长度一致,则返回0。【实例4.23】使用strcmp()函数字符串比较。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charstr1[]="apple";charstr2[]="banana";intresult=strcmp(str1,str2);if(result==0){printf("两个字符串相等。\n");}elseif(result<0){printf("str1小于str2。\n");}else{printf("str1大于str2。\n");}return0;}程序运行结果如下。str1小于str2。str1="apple"和str2="banana",第一个字符'a'(97)与'b'(98)比较,'a'<'b',因此返回负数。4.3字符数组与字符串4.3.5字符串处理函数第4章数组注意事项:(1)区分大小写。strcmp()是区分大小写的。例如,"Apple"和"apple"被认为是不同的字符串。如果需要忽略大小写,可以使用strcasecmp()(非标准,但广泛支持)或手动转换为小写/大写后再比较。(2)部分比较。如果只需要比较字符串的前n个字符,可以使用strncmp()。(3)返回值的含义。返回值的具体数值可能是任意负数或正数,不能直接依赖具体的数值,只需判断其符号即可。字符串比较strcmp()函数语法格式如下。strcmp(字符串1,字符串2,n);其作用用于字符串比较的函数。它通过逐个字符比较两个字符串的前n个字符内容,判断它们是否相等或大小关系。按照字典顺序(ASCII值)逐个字符比较,直到遇到不同的字符或字符串结束符'\0'。比较ASCII值:如果str1[i]<str2[i],则返回负数。如果str1[i]>str2[i],则返回正数。如果所有字符相同且长度一致,则返回0。4.3字符数组与字符串4.3.5字符串处理函数第4章数组【实例4.24】使用strncmp()函数字符串比较。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charstr1[]="abcdef";charstr2[]="abcxyz";intresult=strncmp(str1,str2,3);//只比较前3个字符
if(result==0){printf("前3个字符相等。\n");}elseif(result<0){printf("str1的前3个字符小于str2。\n");}else{printf("str1的前3个字符大于str2。\n");}return0;}程序运行结果如下。前3个字符相等。4.3字符数组与字符串4.3.5字符串处理函数第4章数组6.求字符串的长度strlen()函数求字符串长度strlen()函数语法格式如下。strlen(字符串);其作用计算字符串的长度,不包括结束符'\0'。【实例4.25】使用strlen()函数求字符串的长度。程序代码如下。#include<stdio.h>#include<string.h>intmain(){intlength;charstr[]="Hello,World!";length=strlen(str);//计算字符串的长度
printf("字符串的长度是:%d\n",length);return0;}程序运行结果如下。字符串的长度是:134.3字符数组与字符串4.3.5字符串处理函数第4章数组【实例4.26】使用strlen()函数判断字符串是否为空。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charstr[]="";if(strlen(str)==0){printf("字符串为空。\n");}else{printf("字符串不为空。\n");}return0;}程序运行结果如下。字符串为空。4.3字符数组与字符串4.3.5字符串处理函数第4章数组7.大写字母转小写字母strlwr()函数大写字母转小写字母strlwr()函数语法格式如下。strlwr(字符串);其作用是将大写字母转小写字母。【实例4.27】使用strlwr()函数将大写字母转小写字母。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charstr[]="Hello,World!";strlwr(str);//将字符串中的大写字母转换为小写
printf("转换后的字符串:%s\n",str);return0;}程序运行结果如下。转换后的字符串:hello,world!4.3字符数组与字符串4.3.5字符串处理函数第4章数组8.小写字母转大写字母strupr()函数小写字母转大写字母strupr()函数语法格式如下。strupr(字符串);其作用是将小写字母转大写字母。【实例4.28】使用strupr()函数将小写字母转大写字母。程序代码如下。#include<stdio.h>#include<string.h>intmain(){charstr[]="Hello,World!";strupr(str);//将字符串中的小写字母转换为大写
printf("转换后的字符串:%s\n",str);return0;}程序运行结果如下。转换后的字符串:HELLO,WORLD!4.3字符数组与字符串4.3.5字符串处理函数感谢您的观看ThankYOU!C语言程序设计第5章函数C语言程序设计第5章函数5.1.1函数概述5.1.2无参函数的定义5.1.3有参函数的定义5.1函数的定义第5章函数函数是C语言程序的基本模块,用户可以把自己的算法编写成一个个相对独立的函数模块。在设计一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年气冲斗牛成语故事人物豪情赏析教案
- 2026 年小学《游子吟》细节抒情古诗赏析教案
- 基于社会情感优化算法的符号回归结题报告
- 二年级科学苏教版期中阶段第一单元同步测试卷基础版A卷
- 基于光热转换的太阳能界面水蒸发结题报告
- 基于光晶格的超冷原子量子模拟结题报告
- 2026年教师资格证面试模拟试题及答案解析
- 2026AIGC驱动下感恩节礼品定制化供应链柔性响应机制研报
- 2026年自学考试汉语言文学专业文学评论冲刺试卷
- 2026住院医师规培-河南-河南住院医师规培(口腔正畸科)历年参考题库含答案详解
- 2026医疗机构治疗膳食临床实践(通则)中国专家共识(2025版)
- 中国开放型经济学-全套课件 第1-12章-马克思主义对外开放思想及其中国化时代化-对外开放与国家经济安全
- 劳动合同2026年标准范本协议
- 无主灯光设计
- CPA会计科目课件
- 物流冰山理论解析
- 2026年消化专科护士培训试题及答案
- 串联电路和并联电路课件2025-2026学年人教版物理九年级全一册
- YB-T6230-2024《不锈钢单位产品能源消耗技术要求》
- 干熄焦安全培训课件
- 《大气科学概论》教学课件-第一章大气概述
评论
0/150
提交评论