strlen函数与sizeof的区别,C语言strlen与sizeof的区别详解

对于 strlen 和 sizeof,相信不少程序员会混淆其功能。虽然从表面上看它们都可以求字符串的长度,但二者却存在着许多不同之处及本质区别。

strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)。其原型如下面的代码所示:

size_t strlen(char const* str);

也正因为 strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:

 
  1. char sArr[] = "ILOVEC";
  2. /*用strlen()求长度*/
  3. printf("sArr的长度=%d\n", strlen(sArr));

很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)。这里需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:

 
  1. /*判断一*/
  2. if(strlen(x)>= strlen(y))
  3. {
  4. }
  5. /*判断二*/
  6. if(strlen(x)- strlen(y)>= 0)
  7. {
  8. }

从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?

原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。

同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:

 
  1. /*判断一*/
  2. if(strlen(x)>= 5)
  3. {
  4. }
  5. /*判断二*/
  6. if(strlen(x)- 5>=0)
  7. {
  8. }

很显然,判断表达式二的结果还是永远是真,其原因与上面相同。

关键字 sizeof 是一个单目运算符,而不是一个函数。与函数 strlen 不同,它的参数可以是数组、指针、类型、对象、函数,字符串常量,等,如下面的示例代码所示:

 
  1. char sArr[] = "ILOVEC";
  2. /*用sizeof求长度*/
  3. printf("sArr的长度=%d\n", sizeof(sArr));

相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小sizeof在计算数组变量(字符串变量)或字符串常量的大小时会自动加上"\0"这个空字符,那么就要在字符串中字符的个数上多加1,且sizeof只计算其在定义时的大小。

 

strlen只计算字符串中字符的个数,strlen计算在运行域中的大小

当用strncpy函数式,最后一个参数max_size 要比字符串字符个数(src,第二个参数)至少大1,因为需要考虑dest这个第一参数,需要在拷贝完成后自动加入"\0"这个空字符,这里面的dest是指针地址。

 

下面是例子:

运行效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值