zoukankan      html  css  js  c++  java
  • 【字符串】strlen函数与sizeof的区别

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

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

    1 size_t strlen(char const* str);

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

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

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

    /*判断一*/
    if(strlen(x)>= strlen(y))
    {
    }
    /*判断二*/
    if(strlen(x)- strlen(y)>= 0)
    {
    }

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

    原因很简单,因为函数 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
    ", sizeof(sArr));
    相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。同时,对 sizeof 而言,因为缓冲区已经用已知字符串进行了初始化,其长度是固定的,所以 sizeof 在编译时计算缓冲区的长度。也正是由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。
     

     

  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/Luthais/p/10257455.html
Copyright © 2011-2022 走看看