字符数组
字符数组是用来存放若干字符的数组。在C语言中没有提供一个字符串类型符,字符串被定义为一个字符数组。例如:
char str[10];
定义 str 是一个字符数组,其中有10个元素,每个元素是一个字符。字符数组除了有一般数组所具有的性质外,还具有它自己的特殊性:
- 字符数组存储的是一串字符序列,其中还可以包括转义字符序列。
- 一个字符数组的字符构成一个字符串,因此,它用一个特殊的串结束符号放在字符串的最后位置上标记一个串的结束,这个串结束标记为ASCII字符的0,即空字符,表示成“\0”。例如,上面定义的str字符数组最多可以存储9个字符,还剩一个字符位置用来存放串结束符。
可以在定义字符数组的同时进行初始化。例如,下面的定义语句:
char s[5] = {'A','B','C','D','\0'}; //初始化方法1
将字符数组s初始化成:
s[0] = 'A',s[1] = 'B',s[2] = 'C',s[3] = 'D',s[4] = '\0'
但这种为字符数组初始化的方法比较麻烦。它不仅要为每个元素都加上一对单引号,还要最后多加一个字符串结束标记。可以使用简单的方法为字符数组进行初始化。例如:
char s[5] = "ABCD"; 或 char s[5] = {"ABCD"}; //初始化方法2
提示:在初始化方法2中,由于C语言给字符串自动加上串结束标识“\0”,所以数组长度应该比初始化元素个数多1。初始化方法1和初始化方法2的区别是,采用前者时,C语言不会自动添加“\0”,采用后者时,C语言会自动添加“\0” 。
这种赋初值的方法,编译系统会自动在字符串的结尾加上一个结束标记。当然,也可以使用以下更简单的方法定义并初始化字符数组s,即省去数组的长度:
char a[] = "ABCD";
字符数组s在内存中的存储方式为:
s[0] | s[1] | s[2] | s[3] | s[4] |
A | B | C | D | \0 |
由于字符串结束符的存在,一个字符串在内存中所占的存储空间比实际存储的字符个数多 1。
字符串数组
字符串数组是这样的数组,它的每个元素又都是一个字符串。字符串数组是二维数组。采用二维字符串数组时,可先将二维变成若干个一维数组,其处理方法与一维数组相同。例如:
char s[2][10];
该语句定义s是一个具有两个字符串元素的字符串数组,每个字符串元素的长度为10个字符,包括字符串结束符“\0”。
一维字符串数组元素的引用,使用的是第一个下标元素,如s[0]表示数组中第一个字符串元素的首地址,s[1]表示数组中第二个字符串元素的首地址。
可以使用以下几种方法对字符串数组进行赋值操作。
(1)初始化赋值
在定义字符数组时赋值。例如:
static char name[2][8] = {"Mary","Smith"};
结果为:
name[0] = "Mary", name[1] = "Smith";
(2)使用一般赋值语句赋值
对二维数组的每个字符元素进行赋值,例如:
name[0][0] = 'M'; name[0][1] = 'a'; name[0][2] = 'r'; name[0][3] = 'y';
则将字符串"Mary"赋给name[0]。
另外,还可以使用标准IO函数和标准字符串函数给字符串数组赋值。
字符串处理函数
下面介绍几种常用的函数,调用这些函数时,在程序的开头应添加预编译命令:
#include<string.h>
(1) puts(字符数组)
将一个字符串(以0结束的字符序列)输出到终端。用puts函数输出的字符串中可以包含转义字符。
(2) gets(字符数组)
从终端输入一个字符串到字符数组,并且得到一个函数值,该函数值为字符数组的起始地址。
(3)strcat(字符数组1,字符数组 2)
连接两个字符数组中的字符串,把字符串2连接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值,该函数值为字符数组1的地址。
(4) strcpy(字符数组1,字符串 2)
将字符串2复制到字符数组1中。其中字符数组1必须定义得足够大,以便容纳被复制的字符串,且字符数组1必须是数组名形式或字符型指针变量。
注意,不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组,如下面的赋值语句是不合法的:
str1 = "China";
str1 = str2;
而只能用strcpy函数处理。如:
strcpy(str1,"China");
strcpy(strl,str2);
(5) strcmp(字符串1,字符串2)
比较字符串1和字符串2。如果字符串1等于字符串2,函数返回值为0;如果字符串1大于字符串2,函数返回值为一正整数;如果字符串1小于字符串2,函数返回值为一负整数。
提示:对两个字符串比较时不能用 if (str1 == str2)…,而只能用 if (strcmp(strl, str2) == 0)…。
(6) strlen(字符串)
返回“字符串”的长度。函数值为“字符串”的实际长度,不包括0在内。例如:
char str[20] = "China";
printf("%d\n",strlen(str));
输出结果不是 20,也不是6,而是5。
(7) strlwr(字符串)
将“字符串”中的大写字母转换成小写字母。
(8) strupr(字符串)
将“字符串”中的小写字母转换成大写字母。