第七章:字符数组
概述
用来存放字符数据的数组是字符数组,常用来处理字符串.
字符数组其实就是类型为char的数组.
同其他类型的数组一样,字符数组既可以是一维的,也可以是二维的甚至是多维的.
但是由于字符数组和普通的数组具有差异,因此将单独讲解字符数组.
本章内容如下:
- 字符数组的定义
- 字符数组的初始化
- 字符数组的引用
- 字符数组与字符串的关系
- 字符数组的输入与输出
- 字符串处理函数
字符数组的定义
一维数组的定义:
char 数组名[常量表达式];
二维数组的定义:
char 数组名[常量表达式][常量表达式];
而且由于在C语言中字符型数据可以和整型通用,但是由于每个整形数据划分两个字节(8个比特位)的空间,而每个字符数据划分一个字节(4个比特位)的空间.
因此最好不要用整形数组来存放字符型数组浪费空间
字符数组的初始化
字符数组的初始化分成三种.分别是:声明时数组的初始化,声明后数组的初始化和字符串初始化
前两种初始化和普通数组的初始化相同.
声明时字符数组的初始化
语法如下:
char 数组名[常量表达式]={常量表};
需要注意的是:
-
常量表的字符必须是用单引号包裹的单字符.例如:
char Array[14]={'I',' ','a','m',' ','v','e','r','y',' ','g','o','o','d'};
空格可以用转义字符\n来表达
事实上所有的特殊字符都可以用转义字符来代替
声明后字符数组的初始化
语法如下:
Array[i]='字符';
需要注意的是:
- 这里的字符和声明时赋值一样,必须是单引号包括的单个字符’
字符串的初始化
字符串的初始化其实是利用了字符串和字符数组的关系,这点将在后面讲
语法规则如下:
char 数组名[]="字符串";
例如:
char Array[]="Good night!"
需要注意的是,空格作为转义字符\n也包含在字符串中
并且在这样用字符串初始化的方法会在最后自动添加一个结束标记\0
最后的存储就是 Good night!\0
字符数组的引用
字符数组的引用和前面数组的引用一模一样,这里就不再赘述了
字符数组和字符串的关系
在C语言中,字符串就是用双引号包含起来的一段话
例如:
"I am very good"
而字符串在C语言中的存储实际上就是用字符数组实现的.
但是对于字符串而言,如果我们需要知道字符串在什么地方结束,即这句话在那里结束.
因此我们实际上在储存字符串的时候会在字符串的结尾加上一个标志来表明这句话的结束
这个标记并不会计入到字符串的长度中,即用sizeof()求长度时候会包含/0
因此定义一个长度为10的字符数组实际上只能输入9个字符
这个标志就是: \0,对应ASCII值为000
在ASCII表中000表示无/空值(NULL)
需要注意的是数字0在ASCII表中对应的值是048
所以上面那句话在内存中的储存其实是:I am very good\0
字符数组的输入和输出
字符串在字符数组中的储存形式是字符数组.所以对于字符串的输入和输出其实就是字符数组的输入和输出
字符数组的输出
由于字符数组用字符串初始化时有\0结尾标记,而用其他两种方式初始化时没有\0结尾标记.
所以字符数组的输出分成两种
不具有\0标记
对于不具有\0标记的字符数组的输出和普通数组的输出没有区别.就是用for循环遍历输出
例如:
char Array[4]={'G','o','o','d'};
for(i=0;i<4;i++)
{
printf("%c",Array[i]);
}
具有\0标记
对于具有\0标记的字符串,即通过字符串初始化的方式初始化的数组输出有两种方法
第一种就是for循环遍历输出
第二种就是用%s字符配合指针集体输出
例如:
char Array[4]="Good";
printf("%s",Array);
-
Array是Array的首个元素即数字头的指针
-
当字符串中有多个结束标记时,只输出到第一个\0标记
char Array[5]="Go\0od"; printf("%s",Array); >>>Go
-
如果字符数组长度大于实际长度,也只输出到第一个\0
char Array[20]="Good"; printf("%s",Array); >>>Good
字符数组的输入
字符数组的输入有两种
第一种就是for遍历,用%c格式控制符
第二种就是用%s格式控制符.
字符串处理函数
C语言中由很多字符串处理的库函数,这些库函数为字符串处理提供了方便.
他们被封装在头文件中.
在使用的时候需要先导包<string.h>
下面将一一介绍这些函数
输入字符串函数gets
gets函数用于输入一个字符串.调用格式如下:
gets(字符数组);
gets的作用是讲一个字符串存到字符数组中,并且得到一个函数值,返回值是存放输入字符串的字符数组的起始地址,一个整数
例如:
char str[20];
char address;
address=gets(str);
输出字符串函数puts
puts函数用于输出一个以’\0’结尾的字符串.调用格式如下:
puts(字符数组);
-
puts函数输出的字符数组中的转义字符会控制字符(即真实样子)的形式输出
例如:char str[]="hello\tworld"; puts(str);
字符串测长度函数strlen
strlen函数用于测试字符串的长度.返回值为字符串的实际长度,不包括’/0’所占的位置.点用格式如下:
puts(字符数组);
例如:
char str[20]="hello\tworld";
int a;
a=strlen("str");
>>>a=11
strlen函数也可以直接测试字符串的长度
strlen("hello\tworld");
字符串比较函数strcmp
C语言中由于不允许直接使用比较运算符来直接比较两个数组是否相同.
例如:
if(str1==str2)
所以C语言中提供了strcmp函数用于比较两个字符数组是否相同.
从左到右依次按ASCII码值比较.
返回值是比较结果:
- n=0,字符串1=字符串2
- n>0,字符串1>字符串2
- n<0,字符串1<字符串2
字符串复制函数strcpy,strncpy
C语言中,不允许使用赋值语句来直接将一个字符串赋值给另外一个字符数组.例如:
str1=str2
但是C语言提供了两个用于字符串复制的数组
strcpy函数
strcpy函数用于从左到右依次复制直到遇到\0.调用格式如下:
strcpy(待赋值数组,需复制数组)
需要注意的是:
- 字符串1必须是字符数组的首地址
- 字符串2可以使字符数组名,也可以是字符串常量
strncpy函数
strncpy函数用于复制指定个数个字符.调用格式如下:
strncpy(待赋值函数,需复制函数,字符数);
字符串连接函数strcat
strcat函数用于连接两个以\0结尾的字符串,并放入第一个数组中.调用格式如下:
strcat(字符数组1,字符数组2);
例如:
char str1[10]="how";
char str2[20]="are you?";
strcat(str1,str2);
需要注意的是:
是字符数组的首地址
- 字符串2可以使字符数组名,也可以是字符串常量
strncpy函数
strncpy函数用于复制指定个数个字符.调用格式如下:
strncpy(待赋值函数,需复制函数,字符数);
字符串连接函数strcat
strcat函数用于连接两个以\0结尾的字符串,并放入第一个数组中.调用格式如下:
strcat(字符数组1,字符数组2);
例如:
char str1[10]="how";
char str2[20]="are you?";
strcat(str1,str2);
需要注意的是:
- str1的长度要足够,必须要能同时放下str1和str2