目录
数组是C语言的一种重要数据结构,使用数组可以实现同类型数据的连续存储和有效处理。本节介绍使用数组的程序设计,包括一维数组和二维数组的定义、初始化、在计算机中的存储及其使用方法,字符串的输入输出操作及常用的字符串操作函数。
11.1 一维数组程序设计
数组是包含多项同类数据的一种数据结构,它能将一系列相同类型的数据组织起来,使用同一个名称,再用下标进行分量标识。
11.1.1 一维数组的定义及元素引用
- 一维数组定义
数组作为一种变量, 在使用之前必须先行定义。格式为:数据类型 数组名[数组长度]
例如:int array[10]; //该语句定义了名为array的int型数组,该数组有10个元素,能够存储10个整数值
- 一维数组说明
(1)数组的数据类型就是数组元素的数据类型,它可以是 C 语言允许的任何数据类型。
(2)数组长度是数组能够包含的数组元素的个数,通常用一个整数值表示,也可以是常量表达式,但它不允许是包括变量的表达式。
例如,下面对数组的定义方法是错误的:
int n=10;
float a[n]; //定义数组长度时使用了变量n
- 一维数组的元素引用
C语言规定,只能逐个使用数组元素,而不能一次使用整个数组。一维数组元素的引用形式为:数组名[下标]
数组元素的下标从0开始,当数组长度为n时,最末元素的下标是n-1。
在实际使用中,下标可以是一个整数型常量,也可以是整数型表达式,最为常用的是用一个整数型变量表示元素的下标。
11.1.2 数值型一维数组的输入和输出
数值型一维数组的输入输出是通过每一个数组元素的输入和输出实现的。数值型一维数组的元素都是一些简单变量,输入输出按照简单变量的方法进行。
例如,对上述array数组,输入array[3]的值使用如下语句:
scanf(“%d”,&a[3]);
输出array[3]的值使用如下语句:
printf(“%d”,a[3]);
11.1.3 数值型一维数组的初始化
数组初始化是指在定义数组时对数组元素赋初值。通常有两种情况:
- 全部元素的初始化
一般格式为:数据类型 数组名[数组长度]={数组全部元素值表}
“数组全部元素值表”是用逗号分隔的各数组元素的初值。
例如:int a[6]={10,20,30,40,50,60}; //该语句定义了整形数组a,它有6个元素a[0]~a[5],初值依次为10、20、30、40、50、60。
当需要对全部元素初始化时,数组长度允许省略,格式如下:
数据类型 数组名[ ]={数组元素值表}
当用这种省略方式初始化数组时,数组的长度由“数组全部元素值表”中值的个数确定。
例如:float r[]=12.3,-3.22,7.5]; //该语句定义了长度为3的实数型数组r,r[0]、r[1]、r[2]的初值分别为12.3、-3.22、7.5。
- 部分元素的初始化
使用较多的情况是对前部元素的初始化。一般格式为:数据类型 数组名[数组长度]={数组前部元素值表}
例如:int b[10]={1,2,3}; //该语句定义了整数型数组b,它有10个元素,前三个元素b[0]、b[1]、b[2]的初值分别为1、2、3,其余元素的初值由数组b的存储属性决定。
注意:当只对数组的部分元素初始化时,数组长度的说明是不能省略的。另外,由于数组元素本身是一个变量,因此可以使用赋值语句对其单独赋值。
11.1.4 字符型一维数组的初始化
字符型数组是数据类型为char型的数组,用于存储字符串,每一个元素存储一个字符。字符型数组与数值型数组在本质上没有区别,但在具体使用时,还是有其自身的特点,因此对字符型一维数组的初始化进行专门的介绍。
- 字符型一维数组的定义格式
格式如下:
char 数组名[数组长度]
例如: char array[10];
- 字符型一维数组的初始化
(1) 对字符数组初始化时,通常使用转义字符常量’\0’作为末尾元素值。‘\0’是C语言字符串的结束标志,进行字符串处理时,它标志一个字符串的结束。例如:char string[8]={‘e’,’x’,’a’,’m’,’p’,’l’,’e’,’\0′};
(2)可以使用一个字符串常量为字符数组赋初值。当使用这种方式时,系统自动在字符串尾部增加一个结束标志’\0’。例如,上述对数组string的定义可使用如下形式:char string[8]=”example”;
(3) 初始化时,可省略对数组长度的说明,数组的实际长度由系统根据初始化的形式确定。例如:char string[]=”example”; //这种情况,系统将根据存储长度,自动设置数组string的长度为8
11.1.5 一维数组的存储
任何一个一维数组在内存中都占用一段连续的存储空间,依次存储它的各元素的值。各元素占用的字节数由数组的数据类型决定。
11.2 二维数组程序设计
11.2.1 二维数组的定义及元素引用
- 二维数组定义
数组作为一种变量, 在使用之前必须先行定义。二维数组的一般定义格式如下:
数据类型 数组名[表达式1][表达式2];
例如:float a[5][3]; //该语句定义了数组名为a的实数型二维数组,该数组有5行3列,15个数组元素,能够存储15个实数值。
- 二维数组的元素引用
二维数组元素的引用形式为:数组名[下标1][下标2]
其中,下标1和下标2允许是任何形式的整数表达式,分别表示数组元素所在的行号和列号。C语言规定,二维数组的行下标和列下标都从0开始编号。
11.2.2 二维数组的输入和输出
二维数组的输入输出是通过每一个二维数组元素的输入和输出实现的。数组元素是简单变量时,与简单变量的输入输出方法相同。
11.2.3 二维数组的初始化
二维数组的初始化是指在定义二维数组时对数组元素赋初值,既可以对数组的全部元素初始化,也可以对数组的部分元素初始化。
- 按行初绐化
按行初始化的思想是把二维数组的一行当作一个一维数组对待,每行提供一个独立的数据集合。
例如:int a[2][3]={ {1,2,3},{4,5,6}};
- 按行逐列初始化
按行逐列初始化是把提供的初始化数据,按照逐行逐列的顺序依次赋给对应的数组元素。
例如:int b[3][2]={ 10,20,30,40,50,60};
- 部分初始化
按行初始化和按行逐列初始化都可以只对部分数组元素初始化。
例如:int a[2][3]={ {1,2},{4,5,6}}; int b[3][2]={10,20,30};
- 初始化时,二维数组的行数定义部分允许省略
例如:int a[ ][4]={ {1,2},{1,2,3}}; int b[ ][3]={1,2,3,4,5,6,7,8,9};
数组初始化数据有两组,系统自动确定数组行数为2;b数组的行数定义被省略,初始化数据共9个,列数值为3,即每行3个数,所以a数组的行数是9/3=3,即b为3×3的数组。
11.2.4 二维数组的存储
二维数组在计算机中存储时,计算机按照二维数组的大小分配一段连续的内存空间,逐个存储二维数组的各个元素,各个元素的存储采用按行逐列的顺序。
数组所占存储空间的首单元地址称为数组的首地址,该地址可直接使用数组名表示。
11.3 字符串操作
11.3.1 字符串的输入输出
C语言提供了多个函数支持字符串输入输出操作,如专门的输入输出函数gets()和puts()、格式化输入输出函数scanf()和printf()等。
- 使用gets()函数输入字符串
格式:gets(字符数组名)
功能:从键盘输入一个字符串,并存储在指定数组中。
例如:char str[12]; gets(str); //执行gets()函数后,系统等待从键盘输入一个字符串。
- 使用puts()函数输出字符串
格式:puts(字符数组名)
功能:输出存储在字符数组中的字符串。
例如: char c[6]=”China”; puts(c);
- 使用scanf()函数输入字符串
格式:scanf(“%s”,字符数组名);
例如:char str[12]; scanf(“%s”,str);
使用scanf()函数和“%s”格式符输入字符串时,要注意:
(1)C语言中,数组名代表数组的起始地址,因此,使用字符数组接收字符串时,在scanf函数中直接使用该数组的数组名。
(2)在输入的字符串中,只有第一个空格(字符串前端空格除外)之前的字符串被被读入到字符数组中。
(3)可以一次输入多个字符串,输入的各字符串之间要以“空格”分隔。
例如:char str1[5],str2[5],str3[5]; scanf(“%s%s%s”,str1,str2,str3);
输入数据:How are you?
则字符数组str1,str2,str3分别获得字符串“How”、“are”、“you?”。
- 使用printf()函数输出字符串
格式:printf(“%s”,字符数组名);
例如: char c[6]=”China”; printf(“%s”,c);
11.3.2 多字符串操作函数
- 连接字符串函数strcat()
格式:strcat(s1,s2)
功能:把字符串s2连接到字符串s1的后面。
说明:①s1是字符数组名或字符数组的开始地址,s2既可以是字符数组名,也可以是字符串常量。②函数执行后,s1是连接之后的字符串,s2保持不变,定义s1数组时,其数组长度应不小于两个字符串长度之和。
- 复制字符串函数strcpy()
格式:strcpy(s1,s2)
功能:把字符串s2复制到字符数组s1中。
说明:①s1是字符数组名或字符数组的开始地址,s2既可以是字符数组名,也可以是字符串常量。s1不能是字符串。②s1数组的长度应不小于s2数组的长度,以保证能够存储s2,否则会出现错误。
- 字符串比较函数strcmp()
格式:strcmp(s1,s2)
功能:比较字符串s1和字符串s2的大小。
说明:①s1、s2可以是字符数组名或字符数组的开始地址,也可以是字符串。②字符串比较就是比较字符串中字符的编码值(如ASCII码),编码值大的字符串大。比较的方法是对两个字符串自左至右逐个字符比较,直到遇到不同字符或‘\0’时比较过程结束,此时,ASCII码值大的字符所在的字符串大。③strcmp函数返回一个数值。s1与s2相同时,strcmp(s1,s2)的值为0;s1大于s2时,strcmp(s1,s2)的值为一个正数;s1小于s2时,strcmp(s1,s2)的值为一个负数。
注意:字符串只能用strcmp()函数比较,不能用关系运算符“==”比较。
- 其他字符串操作函数
除以上的字符串操作函数外,字母的大小写转换函数、求字符串长度函数等也是常用的字符串操作函数。如下表所示:
其他几个常用的字符串操作函数
函数及用法 功能 说明 strlwr(s) 将字符串s中的大写字母转换为小写字母 s可以是字符数组名(字符串首地址),也可以是字符串常量 strupr(s) 将字符串s中的小写字母转换为大写字母 strlen(s) 求字符串s的长度