第 6 章 利用数组处理批量数据
一批具有同名的同属性的数据组成一个数组。数组具有以下特点:
- 数组是一组有序数据的集合。数组中各数据的排列是由一定规律的,下标代表数据在数组中的序号。
- 用一个数组名和下标来唯一地确定数组中的元素,规定用方括号中的数字来表示下标。
- 数组中的每一个元素都属于同一个数据类型,不能把不同类型的数据放在同一个数组中。
6.1 怎样定义和引用一维数组
6.1.1 怎样定义一维数组
定义一维数组的一般形式为:
类型符 数组名[常量表达式]
说明:
- 数组名遵循标识符命名规则
- 定义数组时要指定数组长度,即方括号中的常量表达式用来表示元素个数
- 常量表达式可以包括常量和符号常量。C 语言不允许动态定义数组大小
6.1.2 怎样引用一维数组元素
数组定义并对各元素赋值后,可以引用数组中的元素。
引用数组元素的表示形式为:
数组名[下标]
下标可以是整形常量或整形表达式。数组元素的下标从 0 开始,最大为数组长度 - 1。
6.1.3 一维数组的初始化
常在定义数组的同时给各元素赋值,称为数组的初始化。
可以用“初始化列表”方法实现数组的初始化。
- 定义数组时对全部数组元素赋予初值
- 可以只给数组前面的部分元素赋值,系统自动给后面的部分元素赋初值 0
- 可以给数组中全部元素值赋值为 0
- 在对全部元素赋初值时,可以不指定数组长度
说明:在定义数值型数组时,指定了数组的长度并对之初始化。未被“初始化列表”指定初始化的数组元素,系统会自动初始化为 0(字符型数组初始化为 ‘\0‘,指针型数组初始化为 NULL)。
6.1.4 一维数组程序举例
6.2.1 怎样定义二维数组
二维数组定义的一般形式为:
类型符 数组名[常量表达式][常量表达式]
二维数组可被看作一种特殊的一维数组,它的元素是一个一维数组。
用矩阵形式表示的二维数组是逻辑上的概念。在内存中各元素是连续存放的,是线性的。C 语言中,二维数组中元素排列的顺序是按行存放的。
C 语言中还可定义多维数组,概念同二维数组。
6.2.2 怎样引用二维数组的元素
二维数组元素的表示形式为:
数组名[下标][下标]
在引用数组元素时,行下标和列下标应在已定义的数组大小的范围内。
6.2.3 二维数组的初始化
可以采用“初始化列表”对二维数组初始化。
- 可以分行给二维数组赋初值
- 可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值
- 可以对部分元素赋初值,也可以对各行中的部分元素赋初值,还可以对某几行元素赋初值
- 如果对全部元素赋初值,则第一维的长度可以不指定,第二维的长度不能省略
6.2.4 二维数组程序举例
6.3 字符数组
C 语言中没有字符串类型,字符串是存放在字符型数组中的。
6.3.1 怎样定义字符数组
用来存放字符数据的数组是字符数组。在字符数组中的一个元素内存放一个字符。
字符型数组以整数形式(ASCII 代码)存放的,因此可以用整形数组来存放字符数据。
6.3.2 字符数组的初始化
字符数组的初始化,以“初始化列表”的方式把各个字符依次赋给数组中各元素。
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。
使用“初始化列表”给字符数组部分元素赋值时,其后的元素会自动定为空字符(即 ‘\0‘)。
使用“初始化列表”给字符数组全部元素赋值时,定义时可以省略数组长度。
6.3.3 怎样引用字符数组中的元素
可以引用字符数组中的一个元素,得到一个字符。
6.3.4 字符串和字符串结束标志
C 语言中,字符串作为字符数组来处理的。字符串是存放在一维数组中的。
C 语言规定了一个“字符串结束标志”,以字符‘\0’作为结束标志。在遇到字符‘\0’时,表示字符串结束,前面的字符组成一个字符串。
C 系统在字符数组存储字符串常量时会自动加一个‘\0’作为结束符。用‘\0’作为字符串结束标志不会产生任何附加的操作或增加有效字符,只起一个供辨别的标志。
在字符数组初始化时常常人为地加上一个‘\0’。此外,字符数组初始化还能用字符串常量来使字符数组初始化。
在使用 printf 格式化输出字符串时,遇到‘\0’就停止输出。因此,只会输出第一个‘\0’之前的字符。
6.3.5 字符数组的输入输出
字符数组的输入输出有两种方法:
- 逐个字符输入输出。用格式符“%c”输入或输出一个字符
- 将整个字符串一次输入或输出。用“%s”格式符
说明:
- 输出的字符中不包括结束符‘\0’
- 用“%s”格式符输出字符串时,printf 函数中的输出项时字符数组名
- 如果数组长度大于字符串的实际长度,也只输出到遇‘\0’结束
- 如果一个字符数组中包含一个以上‘\0’,则遇到第一个‘\0’时就结束输出
- 可以用 scanf 函数输入一个字符串。scanf 函数的参数是已定义的字符数组名,数组名即代表数组的起始地址,不能再加地址符 &
- 输入的字符串应短于已定义的字符数组的长度,数组中未被赋值的字符自动置‘\0’
- 使用一个 scanf 函数输入多个字符串时,在输入时以空格分隔。
- printf 输出字符串时,按照字符数组名得到数组的起始地址,逐个输出其中的字符,直到遇到‘\0’为止
6.3.6 使用字符串处理函数
C 函数库中提供了一些用来专门处理字符串的函数。
1. puts 函数——输出字符串的函数
一般形式为:
puts(字符数组)
puts 函数的作用是将一个字符串(以‘\0’结束的字符序列)输出到终端,字符串中可以包含转义序列。
在用 puts 输出时将字符串结束标志‘\0’转换成‘\n’,即输出完字符串后换行。
2. gets 函数——输入字符串的函数
一般形式为:
gets(字符数组)
gets 函数的作用是从终端输入一个字符串到字符数组,并返回字符数组的起始地址作为函数值。
注意:用 puts 和 gets 函数只能输出或输入一个字符串。
3. strcat 函数——字符串连接函数
一般形式为:
strcat(字符数组 1, 字符数组 2)
strcat 函数的作用是把两个字符数组中的字符串连接起来,把字符串 2 拼接到字符串 1 的后面,结果存放在字符数组 1 中,并返回字符数组 1 的起始地址作为函数返回值。
说明:字符数组 1 必须足够大,以便容纳连接后的新字符串。在连接时将字符串 1 后的‘\0’去掉,只在新串最后保留‘\0’。
4. strcpy 和 strncpy 函数——字符串复制函数
一般形式为:
strcpy(字符数组 1, 字符数组 2)
strncpy(字符数组 1, 字符数组 2, n)
- strcpy 函数的作用是将字符串 2 复制到字符数组 1 中去
- strncpy 函数的作用是将字符串 2 中前 n 个字符复制到字符数组 1 中去
说明:
- 字符数组 1 的长度不应小于字符串 2 的长度。
- 字符数组 1 要写成字符数组,字符串 2 可以是字符数组或者是字符串常量。
- 复制时是将字符数组 2 中的字符串(包括‘\0’)复制到到字符数组 1 中,字符数组 1 中超出字符数组 2 长度的字符保留不变。
- 字符数组名是一个地址常量,不能被改变值。不能用赋值语句将一个字符串常量或字符数组直接赋值给一个字符数组。只能用 strcpy 函数将一个字符串复制到另一个字符数组中去。
- 可以用 strncpy 函数将字符串 2 中前 n 个字符复制到字符数组 1 中去,但不能多于字符数组 1 的长度。
5. strcmp 函数——字符串比较函数
一般形式为:
strcmp(字符串 1, 字符串 2)
strcmp 函数的作用是比较字符串 1 和字符串 2。
说明:字符串比较的规则是将两个字符串自左至右逐个字符比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到‘\0’为止。
- 如全部字符相同,则认为两个字符串相等
- 若出现不相同的字符,则以第一对不相同的字符的比较结果为准。
比较的结果由函数值返回。
- 如果字符串 1 与字符串 2 相同,则函数值为 0。
- 如果字符串 1 大于字符串 2,则函数值为一个正整数。
- 如果字符串 1 小于字符串 2,则函数值为一个负整数。
注意:不能用比较运算符对两个字符串进行比较,因为字符数组名代表地址。
6. strlen 函数——测字符串长度的函数
一般形式为:
strlen(字符数组)
strlen 函数是测试字符串长度的函数,返回字符串的实际长度(不包括‘\0’在内)作为函数返回值。
7. strlwr 函数——转换为小写的函数
一般形式为:
strlwr(字符串)
strlwr 函数的作用是将字符串中大写字母转换成小写字母。
8. strupr 函数——转换为大写的函数
一般形式为:
strupr(字符串)
strupr 函数的作用是将字符串中小写字母转换成大写字母。
库函数并非 C 语言本身提供的组成部分,而是 C 语言编译系统提供的公共函数。
注意:在使用字符串处理函数时,应当在程序文件开头引用 #include <string.h>
头文件。