strlen()和sizeof()总结

1.strlen()为一个函数,用来计算字符串的长度,其原型为:unsigned int strlen (char *s);

在计算时,从字符串的首地址开始搜索字符串结束符‘\0’,返回的值不包括结束的字符‘\0’。

其中当s为字符数组时,也是搜索字符串结束符,所以一些情况要手工添加‘\0’

例如:
char b[] = "abcde";
char aa[6];
memcpy(aa,b,5);
aa[5] = 0; // 必须手工指定终结符

int bLen = sizeof(b);  // 6
int aaLen = sizeof(aa);// 6
int bL = lstrlen(b); // 5
int aaL = lstrlen(aa); // 5

2.sizeof()为计算实际分配来多少的内存空间,当为字符串是,需要算上结尾的‘\0’

例如:

char buffer[] = "this";
sizeof(buffer) = 5;
strlen(buffer) = 4;


注意当sizeof()中为字符指针的时候,不能返回值是指针的长度为4.

一般来说字符数组和字符类型的指针可以相互转换,字符数组作参数的时候会退化为字符指针,但是有些情况例外:

用作sizeof()时候

char *a="abcde"

strlen(a) // 5
sizeof(a) // 4 a是一个指针啊 指针都是4byte大


一些帮助理解的小例子

1.

char s[]=“abc\0ch” ;
sizeof(s)=7   sizeof是获得变量s所占的内存的大小,当数组不给出元素个数值时,按初始化的数据所占空间的大小确定。“abc\0ch”计有6个字符,字符串尾会自动补一个\0,因此,s占内存空间为7个字节。
strlen(s) =3  函数strlen(s)是从s地址开始统计,遇到\0时结束,返回统计到的字符个数

2.
sizeof()返回的长度包括'\0'吗?
sizeof无关\0你申请多长就是多长,另外如果是字符串的话,你申请的长度是包括字符串结束符的,所以从这个方面理解,包括‘\0’.

3.
char a[5]={'a','b','c','d','e'}
不能把它看成一个正常的字符串,只能当成字符数组,不能用作strlen操作,但是可以sizeof()值是5.

4.
char *b="abcde";那b可以直接拷贝到一个char a[5]这样的数组中吗?
不能拷贝,因为字符串b需要6个内存单元,末尾有自动添加的字符串结束符。

char a[5];
char b[] = "abcde";
lstrcpy(a,b); // ok 不用指定终结符

char aa[6];
memcpy(aa,b,5);
aa[5] = 0; // 必须手工指定终结符

int aLen = sizeof(a);  // 5
int bLen = sizeof(b);  // 6
int aaLen = sizeof(aa);// 6
int aL = lstrlen(a); // 5
int bL = lstrlen(b); // 5
int aaL = lstrlen(aa); // 5


要注意memcpy与lstrcpy的区别

5.
用运算符sizeof 可以计算出数组的容量(字节数)。实例一sizeof(a)
的值是12(注意别忘了’\ 0 ’)。指针p 指向a,但是sizeof(p)的值却是4 。这是因为
sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p 所指的内
存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。当内存已经申请的时候,可以直接返回申请的内存的数量,这个时候不会退化为指针
实例二注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。示例
二,不论数组a 的容量是多少,sizeof(a)始终等于sizeof(char *)。

char a[ ] ="hello world";
char *p =a;
cout<<sizeof(a)<<endl;//12 字节
cout<<sizeof(p)<<endl;//4 字节
实例一计算数组和指针的内存容量
void Func(char a[ 100] )//当字符数组作函数的参数时,会蜕变为指针。
{
cout<<sizeof(a)<<endl;//4 字节而不是100 字节
}
实例二b数组退化为指针,也可以理解为此时char并没有实际分配内存,所以无法获得他指定内存的容量。
但是char a[3];此时分配内存空间
sizeof(a)值为3.此时分配来三个内存单元。
char a={"acb\0de"},此时sizeof(a)为7,因为分配来7个内存空间,忽略'\0'.
char a[10]={"sdfcdc"};
char b[10]={'a','b','c','d'};
char d[]={"abcd"};
char e[]={'a','b','c','d'};
则sizeof(a)=10;sizeof(b)=10;sizeof(c)=5,sizeof(d)=4.

6.关键是
区分字符数组和字符串两个概念:
1
字符数组不考虑其中有没有'\0'
字符串操作借用字符数组,并规定字符'\0'为串结束标志。
2
定义字符数组并指定大小,如char a[5],此时系统作字符数组处理,size=5;
如果不指定大小,如char a[]="xxx";,或者char*p="xxx";,此时系统作字符串处理,自动在末尾加'\0',size比字符数多1。
需要注意的是:对于char a[5];
其一,strlen(a)返回的值是不确定的,取决于相关内存中的不确定值;
其二,鉴于内存分配的字符对齐方式,所以在做了strcpy(a,"abcdefg");之后,不一定就会出错,因为a后面可能就有几个系统留下的空间。
3
区分内存操作与串操作的不同,串操作要检查'\0'的存在,或自动设置'\0'。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值