第1个回答 2009-11-30
这个呢 是我看过的一篇写的关于字符数组的 我觉得写得蛮好的 基本上把要注意的地方都提出来了 我呢 也加入了一些我个人的理解 应该没错的
1 字符数组的初始化
字符数组可以在定义时进行初始化.有两种初始化方法.
方法1:逐个字符赋给数组中各元素.这种方法最容易理解.例如:
char c[5]={ 'H','a','p','p','y' };
把5个字符分别赋给c[0]至c[4].以下是几点说明:
(1) 如果大括号内提供的初值个数(即字符个数)大于数组长度,则编译时将出错.
如果初值个数小于数组长度,则只将这些字符赋给前面的数组元素,其余的元素自动赋空字符(即'\0').例如:
char c[10]={ 'h','e','l','l','o' };
数组状态如下所示:
c[0]=h , c[1]=e , c[2]=l , c[3]=l , c[4]=o
c[5]=\0, c[6]=\0, c[7]=\0, c[8]=\0, c[9]=\0
(2) 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值字符个数决定数组大小.如:
char c[]={ 'p','r','o','g','r','a','m' };
数组长度自动定义为7.此方法可省略逐个数字符的个数,对多字符赋值比较方便.
(3) 也可以给多维数组初始化.如下初始化二维数组的例子:
char trinangle[3][5]={ { ' ',' ','o' },{ ' ','o','o','o' },{ 'o','o','o','o','o' } };
trinangle数组中存放的是一个三角形的图形,如:
o
ooo
ooooo
下面来看一个例子:
main() /*输出如上三角形*/
{
char trinangle[3][5]={ { ' ',' ','o' },{ ' ','o','o','o' },{ 'o','o','o','o','o' } };
int i,j;
for(i=0;i<=2;i++) /*外层列循环*/
{
for(j=0;j<=4;j++) /*内层行循环*/
printf("%c",trinangle[i][j]);
printf("\n"); /*每循环一次,换行一次*/
}
}
方法2:用字符串常量来给字符数组初始化.例如:
char c[]={ "Good idea" };
这时,编译计算出该数组的大小为10.为什么不是9呢?因为编译程序在扫描整个字符串的时候,自动在该串末尾加上'\0'字符,以表示字符串到此结束,并把它一起存入字符数组中.这点请务必注意.因此,上面的初始化与下面的初始化等价:
char c[]={ 'G','o','o','d',' ','i','d','e','a','\0' };
而不与以下写法等价:
char c[]={ 'G','o','o','d',' ','i','d','e','a' };
前者长度为10,后者长度为9.
小提示:'\0'代表ASCII码为0的字符,它是一个"空操作符",即使什么也不 做.C语言用它来作为字符串结束标志,作用是便于测定字符串的实际长度,例如有一个字符串,其中第10个字符为'\0'则此字符串的有效字符为9个.也就 是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串实际长度.
系统在字符串常量末尾自动加一个'\0'作为结束符.例如"I am a student"共要14个字符,但在内存中占15个字节,最后一个字节'\0'是由系统自动加上的.字符串作为一维数组存放在内存中.需要指出的是:字 符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'.
但是为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组也常常人为地加上一个'\0'.如:
引
char c[5]={ 'L','O','V','E','\0' };
C语言允许在初始化一个一维字符数组时,省略字符串常量外面的大括号.例如:
char c[]={ "I love China" };
可直接写成:
char c[]="I love China";
这种方法清晰直观,符合人们的习惯.但注意不能用单个字符作(用单引号括起来的)为初值,而是用一个字符串(用双引号括起来的)作为初值.如下写法是错误的:
char c[]='I';
多维数组初始化时,推荐使用以下形式直接赋给它多个字符串.例如:
char str[4][8]={ "father","mother","brother","sister" };