所以数组a5有2行。
(6)用按行赋初值方法,对各行的部分或全部元素赋初值,并省略第一维的元素个数。例如,
int a6[][3]={{O,2},{}};
也能确定数组a6共有2行。
4.3 字符数组和字符串
1.字符数组
如果数组的元素类型是字符型(char),则此数组就是字符数组。字符数组的每个元素只能存放一个字符( 存放字符的ASCII代码)。
字符数组的定义形式与其它数组的定义形式一样:
char字符数组名[元素个数];
例如,
char S[5];
表示数组S有五个元素,每个元素能存放一个字符,整个数组最多可存放五个字符。字符数组元素的引用方法也与普通数组元素的引用方法相同。
字符数组也可与普通数组一样的初始化,字符数组也可利用字符串常量给字符数组初始化。例如,
char aStr[]={"12345"};
并可省略花括弧,简单地写为
char aStr[]=" 12345" ;
注意:字符数组aStr[]的元素有六个,不是五个。用字符串常量对字符数组初始化,C系统会在字符列末尾添加一个字符串结束符。
2.字符串
称最后有字符率结束符'\0'的字符序列为字符串。字符数组中存储的字符序列本身并不要求最后一定要有字符'\0'。但当字符数组内存储的内容需要作为字符串时,就必须要有标记符'\'。当字符数组内存储的是字符串时,可用”%s”格式输出,若是普通的字符序列,则它不能用格式”%s”输出,而只能结合循环用格式”%c”输出。
指定元素个数的字符数组用字符串常量给它初始化时,其元素个数不能小于字符串常量的字符数,但数组的元素个数可以等于字符串常量的字符数。例如,
char ss[3]="abc";
则, ss[0]='a',ss[l]='b', ss[2]='c'。此时,字符数组ss中存储的是字符序列,不是字符串。
字符率结束标记符的代码是8位全0,称为空字符,程序用'\0'来标记。字符串的结束标记符紧接在字符串的有效字符列之后。例如,一个有8个有效字符的字符串,其长度为8个字符,但在它的第九个位置存有结束标记符'\0'。
请读者注意以下几点:
(l)字符率与存储字符串的字符数组有区别。字符率的有效字符是指从所指位置的第一个字符开始至字符串结束标记符之前的那些字符。格式符”%s”只输出字符串的有效字符,而不会再继续输出字符率结束标记符及其之后的字符。例如,
char str[50]="Pas\0cal Cobol Fortran C";
printf("%s\n",str) ;
将只输出:
Pas
而实际上,数组str[]字符率结束符之后还存有其它许多字符。
(2)用"%s"格式输出字符串时,不包括字符串结束标记符。对应的输出项是字符串或字符串名。字符数组名可作为字符串名。对于上例,写成
printf("%s",s[0]);
是错误的。因s[0]是数组s的元素,是一个字符,不是字符串。
(3)在调用scanf()为字符数组输入字符串时,输入项是数组名,不要加地址运算符&。