章节结构
- 6.1 怎样定义和引用一维数组
- 6.1.1 定义一维数组
- 6.1.2 引用一维数组元素
- 6.1.3一维数组的初始化
- 6.1.4一维数组程序举例
- 6.2 怎样定义和引用二维数组
- 6.2.1 定义二维数组
- 6.2.2 引用二维数组元素
- 6.2.3 二维数组的初始化
- 6.2.4 二维数组程序举例
- 6.3 字符数组
- 6.3.1 定义字符数组
- 6.3.2 字符数组的初始化
- 6.3.3 引用字符数组的元素
- 6.3.4 字符串和字符串结束标志
- 6.3.5字符数组的输入输出
- 6.3.6使用字符串处理函数(8个)
- puts函数——输出字符串的函数
- gets函数——输入字符串的函数
- strcat函数——字符串连接函数
- strcpy和strncpy函数——字符串赋值函数
- strcmp函数——字符串比较函数
- strlen函数——测字符串长度的函数
- strlw函数——转换为小写的函数
- strupr函数——转换为大写的函数
- 6.3.7 字符数组应用举例
6.1 怎样定义和引用一维数组
数组的特点:
- 数组是一组有序数据的集合。 下标代表数据在数组中的序号。
- 用一个数组名和下标来唯一确定数组中的元素
- 数组中的每一个元素都属于同一个数据类型
6.1.1定义一维数组
定义一维数组的一般形式:类型说明符 数组名[常量表达式]
- (1)数组名的命名规则和变量名相同,遵循标识符命名规则
- (2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式表示元素的个数,即数组长度。(在引用时则表示的不是个数而是索引,最大值应为元素个数-1,从零算起)
- (3)常量表达式中可以包括常量和符号常量,也可以是这一类的表达式。但不能有变量,且必须是整型表达式
C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值
6.1.2怎样引用一维数组元素
在定义数组并对其中各元素赋值后,就可以引用数组中的元素。
只能引用数组元素而不能一次整体调用整个数组全部元素的值。
引用数组元素的形式为: 数组名[下标]
数组元素的遍历:通过一个for循环即可实现
for (i=0;i < L.length;i++)
一维数组的初始化
数组的初始化:定义数组的同时给各数组元素赋值。
初始化的方法4种
“全元赋,部元赋,全赋零,不指全赋”
- 在定义数组时对全部数组元素赋予初值
int a[5] = {1,2,3,4,5} - 可以只给数组中的一部部分元素赋值
int a[10] = {1,2,3,4,5} - 让一个数组中全部元素值为0
int a[10] = 0; - 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度 int a[] = {1,2,3,4,5}
如果在定义数值型数组时,指定了数组的长度并对之初始化,
凡未被“初始化列表”指定初始化的数组元素,系统会自动把它们初始化为0
(如果是字符型数组,则初始化为'\0'
,如果是指针型数组,则初始化为NULL,即空指针
6.2 怎样定义和引用二维数组
二维数组常称为矩阵(matrix),把二维数组写成行(row)和列(column)的排列形式可以形象化的理解二维数组的逻辑结构
6.2.1 怎样定义二维数组
二维数组定义的一般形式: 类型名 数组名[常量表达式][常量表达式]
C语言中,二维数组中元素排列的顺序是按行存放的。多维数组也是如此。
即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。
6.2.2 怎样引用二维数组的元素
二维数组元素的表示形式为: 数组名[下标][下标]
- 下标必须是整型表达式
- 引用数组元素时,下标值应在已定义的数组大小的范围内
- 注意定义数组时的下标和引用数组元素的下标的区别
- 二维数组元素的遍历:使用嵌套的for循环即可,外循环负责行,即第1维;内循环负责列,即第2维(外行内列)
6.2.3 二维数组的初始化
二维数组的初始化有5种,总结就是第2维的下标不能省 “二维,分行赋;部元赋,又可分行赋;部元赋,1省需分行赋,全元赋,1省2不省;全赋花括号;“
- (1)分行给二维数组赋初值
int a[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
- (2)可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。
- (3)可以对部分元素赋初值,也可以对各行中的某个元素赋初值,也可以对某几行元素赋初值
int a[3][4] = {{1},{2},{5}};
- (4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省
- (5)在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值
int a[][3] ={{3,4,},{1,3,4},{}}
6.3 字符数组
C语言没有字符串类型,也没有字符串变量,字符串是存放在字符型数组中的。
6.3.1 怎样定义字符数组
用来存放字符数组的数组就是字符数组。在字符数组的一个元素内存放一个字符
定义字符数组的方法与定义数值型数组的方法类似 : char a[3]
6.3.2 初始化字符数组
初始化字符数组4法
- 最容易理解的方法初始化列表,把各个字符依次付给数组中各元素。
char a[10] ={'I',' ','a','m',' ',h','a','p','p','y',}; //也合法,因为系统在处理字符串常量存储时,会自动增加一个'\'
char a[11] ={'I',' ','a','m',' ',h','a','p','p','y','\0'};
- 定义时可以省略数字长度,如果提供的初值个数与预定的数组长度相同
- 也可以定义和初始化一个二维字符数组
- 用字符串常量来使字符数组初始化,此时花括号也可以省略
char c[] = {"I am happy"}; //注意数组长度为11,而不是10,因为还有一个字符串结束符'\0'
char c[] = "I am happy"; //
使用字符串常量初始化字符数组,和使用单个字符作为字符数组的初值,区别就是前者生成的数组长度比后者多一位,因为前者生成字符数组时,会自动在末尾加一个字符串结束符。
6.3.3 怎样引用字符数组中的元素
和普通数组引用数组元素一样: 数组名[常量表达式]
遍历数组元素: for循环,嵌套的for循环
6.3.4 字符串和字符串结束标志
在C语言中,是将字符串作为字符数组来处理的
实际工作中,往往关注的是字符串的有效长度,而不是字符数组的长度。
在C语言中规定了,一个字符串结束标志为,以字符'\0'作为结束标志,
即在遇到字符‘\0’时,表示字符串结束,把它前面的字符组成一个字符串
C系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符
在程序中往往通过检测'\0'的位置来判断字符串是否结束。
在定义字符数组时,保证数组长度始终大于字符串长度
如“C program”共有9个字符,字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节'\0'是由系统自动加上去的。
'\0'代表ASCII码为0的字符,是一个“空操作符”,不显示,注意和空格字符不同
字6.3.5 符数组的输入输出
字符数组的输入输出可以有两种方法
- (1)逐个字符输入输出。用格式字符串“%c”输入输出一个字符
- (2)将整个字符串一次输入或输出。使用格式字符串“%s”输入输出一个字符串
- 不管怎么样记住在内存中存储字符串一定是由'\0'作为字符串结束标志的
说明:
- (1)输出的字符中不包括结束符'\0',该字符不显示
- (2)用“%s“格式字符串输出字符串时,printf函数中的输出表列是字符数组名,而不是数组元素名。
printf("%s",array) // 不能是array[0]
- (3)如果数组长度大于字符串的实际长度,也只能输出到遇'\0'时输出就结束
- (4)如果一个字符数组中包含一个以上的‘\0’,遇到第一个'\0'时输出就结束
- (5)可以用scanf函数输入一个字符串
scanf("%s",c) //数组名就是地址
如果利用一个scanf函数输入多个字符串,应在输入时以空格分隔
使用字符串处理函数
C语言编译系统提供的常见9个字符串处理函数
puts函数、gets函数
strlwr函数、strupr函数
strcat函数、
strcmp函数、strlen函数
strcpy函数和strncpy函数
- (1)puts函数——输出字符串的函数
puts(字符数组)
其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。
- 用puts函数输出的字符串中可以包含转义字符。
char str[] = {"China\nBeijing"}; puts(str); ---------- 输出: China Beijing
- 在用puts输出时将字符串结束标志'\0'转换成'\n',即输出完字符串后换行
- (2)gets函数——输入字符串的函数
gets(字符数组)
其作用是从终端输入一个字符串到字符串数组,并且得到一个函数值。
该函数值是字符数组的起始地址gets(str); // str是已定义的字符数组 如果从键盘输入 Computer此处按下enter键 将输入的字符串“Computer”送给字符数组str (注意这里,**送给数组的共有9个字符,而不是8个字符**), 返回的函数值是字符数组str的第一个元素的地址。
*用puts和gets函数只能输出或输入一个字符串。
-
(3) strlwr函数
strlwr(字符串)
,将字符串中大写字母换成小写字母 -
(4)strupr函数
strupr(字符串)
,将字符串中小写字母换成大写字母 -
(5)strcat函数——字符串连接函数
strcat(字符数组1,字符数组2)
其作用是把两个字符数组中的字符串连接起来,把字符串2街道字符串1的后面
结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址
- 字符数组1必须足够大,以便容纳连接后的字符串。
- 连接前两个字符串的后面都有'\0',连接时将字符串1后面的'\0'取消,只在新串最后保留'\0'
- (6)strcmp函数——字符串比较函数
strcmp(字符串1,字符串2)
对于两个字符串比较只能使用if (strcmp(str1,str2) > 0)
- (7) strlen函数——测字符串长度的函数
strlen(字符数组)
函数的值为字符串中的实际长度(不包括'\0'在内),
也可以直接测试字符串常量的长度,即strlen("China");
- (8)strcpy和strncpy函数——字符串复制函数
strcpy(字符数组1,字符串2)
- 字符数组1必须定义得足够大,以便容纳被赋值的字符串2.字符数组1的长度不应小于字符串2的长度
- “字符数组1“必须写成数组名形式(如str1),"字符串2"可以是字符数组名,也可以一个是字符串常量
- 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。字符数组名是一个地址常量,它不能改变值,正如数值型数组名不能被赋值一样
下面两种都是错误的
str1 = ”China"; // 试图将一个字符串常量直接赋值给一个字符数组
str1 = str2; // 试图将一个字符数组直接赋值给一个字符数组
只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素char a[5],c1,c2; c1 = 'A';c2 = 'B'; a[0] = 'C'; a[1] = 'h'; a[2] = 'i';a[3] = 'n';a[4] = 'a';
- 可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。
如
strncpy(str1,str2,2);
作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符。但复制的字符个数n不应多于str1中原有的字符(不包括'\0')