字符数组的问题
日期: 2008-05-28 分类: 个人收藏 339次阅读
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
下一篇: JAVA自学路线图
精华推荐