字符数组的问题

来源:互联网 发布:马鞍山网络大学邮编 编辑:程序博客网 时间:2024/04/26 03:40

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’ ,将结束。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 gla错加92号油 怎么办 95和98混加了怎么办 沥青车可以停在居民区怎么办 汽油进到眼睛了怎么办 汽油进了眼睛里怎么办 眼睛里面进了汽油怎么办 脱硫塔里的二氧化硫高怎么办 恐怖黎明铁匠选错怎么办 堡垒之夜草变色怎么办 火柴没有擦的了怎么办 乙醚倒进下水道了怎么办 乙醚和水不分层怎么办 乙醚闻多了头晕怎么办 爱乐维吃了便秘怎么办 刮完滑石粉墙面很软怎么办 被硫酸泼到皮肤怎么办 头磕了一下头晕怎么办 家里有事与工作不能请怎么办 撞了头头晕想吐怎么办 猫不小心摔一下怎么办 一氧化二氮中毒怎么办 电脑开机变慢了怎么办 怎么办抚顺韦德健身卡 预售健身卡合法吗怎么办 被浓硫酸泼到怎么办 婴儿误喝了生水怎么办 宝宝喝了生水拉肚子怎么办 因妈妈喝生水宝宝拉肚子怎么办 喝了几口生水怎么办 不小心吃到蟑螂怎么办 吃了有蛆的樱桃怎么办 不小心误食了蛆怎么办 吃了有蟑螂的汤怎么办 调节天平时指针向右怎么办 香薰蜡烛融化了怎么办 香薰蜡烛挂壁怎么办y 粗蜡烛只烧中间怎么办 紫薯馒头变绿怎么办 小孩手开水烫了怎么办 被油烫伤了怎么办才不留疤 烫伤水泡蹭破了怎么办