库函数strlen详解及模拟实现库函数strlen的三种方法

strlen 是 C 语言标准库中的一个函数,用于计算给定字符串的长度,但不包括字符串的终止字符 '\0'。这个函数定义在 <string.h> 头文件中。理解 strlen 的工作原理和注意事项对于编写高效的 C 程序至关重要。

函数原型

size_t strlen(const char *str);

  • 参数str 是一个指向以 null 结尾的字符串的指针。
  • 返回值:返回字符串 str 的长度,不包括终止的 null 字符。如果 str 是一个空指针,则行为是未定义的(在实际应用中,这通常会导致程序崩溃)。

工作原理

strlen 函数通过遍历字符串中的每个字符,直到遇到第一个 null 字符('\0')为止,来计算字符串的长度。因此,strlen 的效率与字符串的长度成正比,对于非常长的字符串,可能会成为性能瓶颈。

注意事项

  1. 不包括终止字符:返回的字符串长度不包括终止的 null 字符。
  2. 空指针风险:如果传入的字符串指针是 NULL,则 strlen 的行为是未定义的,这通常会导致程序崩溃。因此,在使用 strlen 之前,确保字符串指针不是 NULL 是一个好习惯。
  3. 性能考虑:由于 strlen 需要遍历整个字符串来找到终止的 null 字符,因此在处理非常长的字符串时可能会比较慢。在某些情况下,如果知道字符串的最大长度,使用循环或其他方法来限制遍历的次数可能会更高效。
  4. 线程安全strlen 函数本身是线程安全的,因为它只读取给定的内存区域,不修改任何内容。然而,如果多个线程同时访问或修改同一个字符串,则需要注意线程间的同步问题。

示例代码

#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
printf("The length of '%s' is %zu.\n", str, strlen(str));
return 0;
}

输出:

The length of 'Hello, World!' is 13.

总结

strlen 是 C 语言中用于计算字符串长度的标准库函数,它通过遍历字符串直到遇到 null 字符来计算长度。尽管它很方便,但在使用时需要注意空指针的风险和性能问题。在需要高效处理字符串时,考虑使用其他方法或优化算法可能更为合适。

模拟库函数strlen
 strlen为求字符长度,必不为负数,实际返回类型为size_t,typedef unsigned int
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{
    assert(str != NULL);
    int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}//计算器法

 解析:加上 const 修饰提高代码的健壮性,用 const char* 接收传入的参数。因为 arr 数组名是首元素地址,所以需要用指针变量接收。创建变量 count 来作为计数器,在循环内进行指针加整数,直到碰到 \0 跳出循环,最后返回计数器 count 。
int my_strlen(const char* str)
{
    assert(str != NULL);
    if (*str != '\0')
        return 1 + my_strlen(str + 1);
    else
        return 0;
}//递归法

 解析:首先进行判断,对 str 进行解引用,如果不是 \0 就返回 1 + my_strlen(str + 1) ,此时 " 1+ " 就起到了计数的作用,随后自己调用自己 my_strlen(str + 1) ,递归下去直到是 \0 为止,碰到后返回 0,随后再一步步倒回去,就可以返回长度了。当然,如果传入的字符串长度为 0,会直接走 else 返回 0。
int my_strlen(const char* str)
{
    const char* start = str;
    assert(str != NULL);
    int count = 0;
    while (*str)
    {
        return str-start;
    }
}//指针-指针法

💡 解析:利用 " 指针减指针得到的是元素之间元素的个数" 这一特性得到字符串的长度。首先创建str变量用于记录字符串的起始位置,随后创建start 变量并找到末尾位置( 不是 \0 就往后推进的方法 )。最后返回 str-start,末尾位置减去起始位置即可得到字符串的长度。
int main()
{
    char arr[] = "abcdef";
    int len = my_strlen(arr);
    printf("%d\n", len);
    return 0;
}

其实库函数就用了这种方法,真的是妙不可言!不过将代码进一步地简化了: 

#include <stdio.h>

size_t my_strlen(const char* str)

{
    const char* end = str;
    while (*end++); 
    return end - str - 1;
}

int main()

{
    char arr[] = "abcdef";
    int len = my_strlen(arr);
    printf("len = %d\n", len);

    return 0;
}
 解析:首先其实大可不必创建 start 变量,因为 str 本身就记录着起始位置。while 括号中这种情况下自然可以省去 \0 ,库函数作者直接将 end++ 的操作直接丢入判断条件中。*end++ 优先级相同,根据结合性(从右向左)。因为 while 循环条件会比循环体多执行一次,放进循环条件内的*end++ 因为这个 "特性" 多执行了一次,所以最后 end - start 要手动 -1。返回 end - start - 1 ,即字符串长度。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值