5.1.5 二维字符串数组
二维字符串数组是二维数组的一种特殊形式,其数组元素为字符型。二维字符串数组的定义一般形式如下。
char数组名[常量表达式1][常量表达式2];
其中,方括号中的“常量表达式1”定义了数组中存放的字符串的个数,相当于数组的行数;“常量表达式2”定义了数组中单个字符串的最大长度,相当于数组的列数。二维字符串数组的声明示例如下。
char str[4][80];
本例声明了一个二维字符串数组,可存放4个字符串,每个字符串的最大长度为80个字符(包含空字符“\0”)。
在定义二维字符串数组时,也可以同时对数组进行初始化。和一维字符串数组不同的是,一维字符串数组,可以在初始化时不指定大小,而采用自动分配大小。而在定义二维字符串数组时,不能省略两个方括号中的常量表达式,即一定要指定数组的大小。错误形式示例如下。
char str[][]={“Good”,“morning!”};
本例是错误的二维字符串数组定义方式,因为没有明确指定数组的大小。正确的声明方式如下。
char str[2][10]={“Good”,“morning!”};
在C51程序设计中,经常要用到字符串数组,二维字符串数组和一维字符串数组在程序中的用法相似。二维字符串数组的数组名,即是字符串的第一行的首地址。
二维字符串数组的初始化和二维数组的初始化方法类型,可以采用逐行初始化,也可以采用逐个元素初始化。二维字符串数组的程序示例如下。
01:#include<stdio.h>//头文件
02:#include<string.h>
03:
04:void main()//主函数
05:{
06:char str1[3][8]={“She”,“likes”,“apples”};//声明并初始化二维字符串数组str1
07:char str2[2][5]={{‘b','a','d','\0'},{'g','o','o','d','\0’}};//声明并初始化二维字符串数组str2
08:int i,j;//定义整型变量
09:
10:for(i=0;i<2;i++)//循环逐个输出str2中的数组元素值
11:for(j=0;j<5;j++)
12:printf(“%c”,str2[i][j]);
13:
14:printf(“\n”);//输出换行符
15:printf(“%s\n”,str1);//逐行输出字符串数组str1的第一行
16:printf(“%s%s%s\n”,str1,str1+1,str1+2);//逐行输出字符串数组str1的每一行
17:}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
badgood
She
She likes apples
本例中,采用了两种字符串数组初始化的方法。第一种是对数组str1进行逐行赋值,这种方法简单明了;第二种是对数组str2进行逐个元素赋值,这种方法比较麻烦,一般不推荐使用。采用本例中的两种方法访问二维字符串数组,即逐个访问和逐行访问。逐个访问需要指明该数组的行和列,而逐行访问比较简单,操作十分简便。
提示在上面程序的第7行定义字符串数组时,对每个元素进行赋值,这时需对字符串结束处添加结束标志“\0”。而在第6行中使用双引号括起来的字符串常量,C51编译器自动添加结束标志“\0”。