Young87

当前位置:首页 >个人收藏

字符数组的问题

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" };

2 一些观点在定义完一个字符数组后到底要不要用memset之类的函数初始化呢?比如:

char x[1024];memset(x,0,1024);strcpy(x, y);//或者sprintf之类

  

一个好的习惯是要的但是很多时候都不会出问题  

/

楼上认为一个好的习惯就是初始化,我并这不样认为,VB申请变量时从不初始化,因为它会自动初始化,而VC并不自动初始化,自动初始化带来更傻瓜的效果,但损失了效率,这从某种意义上说正是VB与VC的重要差别之一!如下程序:int i = 0;i = 100 + j; //or for (i = 0; i < 10; i++)都是很垃圾,很教条的程序,我看过一些MFC源码,在申明变量的时候也没有初始化,因为程序员可以保证,下面在使用前一定会初始化,但在申明的时候不能确定值为多少,这种情况下都不初始化,比如:int i;if (!j)i = 100;elsei = 10;

/

以为是C++编程规范中建议的初始化方式char x[1024] = "/0";

或char x[1024];x[0] = 0;  

3 C中memcpy,strcpy,sprintf对一个字符数组赋值得效率 char x[51]; memset(x,0,sizeof(x)); 然后分别处理 memcpy(x,"just a test",11); strcpy(x,"just a test"); sprintf(x,"just a test"); memcpy一次读取所有源数据,然后一次传到目标地址,速度快。 strcpy需要逐个字符判断是否结束符,是一次读一个字节,比memcpy慢。 sprintf可能会有检测输出格式的步骤,所以可能更慢。

strcpy()来自C语言,在C++里得以保留。

首先,要指明的是,C++里strcpy()里接受的参数是C-串,并非string,更不可能是其他类型的数据。它表示一个字串的内容拷贝到另一个字串。拷贝会在源字串里第一个'/0'时停止拷贝. strcpy(目标字串,源字串);

ex:char *temp1,*temp2="test";strcpy(temp1,temp2);

memset()主要用于对一个内存区域初始化。一般用在字符数组上,至少我现在工作上遇到的多为这样的情况。 memset(目标内存空间,拷贝内容,限制);

ex:char temp[30];memset(temp,'/0',sizeof(temp));

正如上面所见,char temp[30]只是分配了一定的内存空间给该字符数组,但并未初始化该内存空间,即数组。所以,需要使用memset()来进行初始化。

memcpy() 除了和strcpy()一样能拷贝字串外,还可以拷贝其他任何类型的数据.

ex:int a[3],b[4];b[4]={0,1,2,3};memcpy(a,b,sizeof(a)); //若为sizeof(b),则会造成数组a[]内存外溢  

================================

如下内容为网络“原版”内容  

Memset  用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;

例 :char a[100];memset(a, '/0', sizeof(a));      

memset 可以方便的清空一个结构类型的变量或数组。

如: struct sample_struct{ char   csName[16]; int    iSeq; int    iType;};

对于变量 struct sample_strcut  stTest; 一般情况下,清空 stTest 的方法:

stTest.csName[0]='/0';stTest.iSeq=0;stTest.iType=0;

用 memset 就非常方便:

memset(&stTest,0,sizeof(struct sample_struct));

如果是数组:  

struct sample_struct   TEST[10];

则 memset(TEST,0,sizeof(struct sample_struct)*10);    

Memcpy  用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。 例: char a[100],b[50]; memcpy(b, a, sizeof(b)); 注意如用 sizeof(a) ,会造成 b 的内存地址溢出。     

Strcpy   就只能拷贝字符串了,它遇到 '/0' 就结束拷贝。

例: char a[100],b[50];strcpy(a,b);

如用 strcpy(b,a) ,

要注意 a 中的字符串长度(第一个 ‘/0’ 之前)是否超过 50 位,如超过,则会造成 b 的内存地址溢出。

str 也可以用用个参数的 strncpy(a,b,n) ======================================================== memset 主要应用是初始化某个内存空间。 memcpy 是用于 copy 源空间的数据到目的空间中。 strcpy 用于字符串 copy, 遇到 ‘/0’ ,将结束。

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 使用JSP连接ORACEL数据库做的登录框架

下一篇: JAVA自学路线图

精华推荐