strlen函数及模拟

以上是c++网站对此库函数的说明

可以看到函数的参数是一个字符指针,返回类型是一个无符号整形size_t

1.strlen函数的参数以及返回值

参数本质上是通过传入的地址对字符串个数进行统计

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
    char* p;
    char  arr[] = "love";
    p = arr + 1;
    printf("%d %d", strlen(p), strlen(arr));
}

常见错误案例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
    char* p;
    char  arr[4] = {'l','o','v','e'};
    p = arr + 1;
    printf("%d %d", strlen(p), strlen(arr));
}

产生这种情况是因为未初始化的内存中存储的是随机值

而strlen只是不计算 \0之后的数据,因此在用strlen统计字符串字符个数一定要包含结束标志\0,以免越界访问产生一些意想不到的bug

事实上,printf输出也一样printf是以%s,字符串的形式输出,遇到字符 ‘\0’ 就认为到达 数组末端了,然后就停止输出了。

下面思考下面代码

int main()
{
    const char* str1 = "abcrrt";
    const char* str2 = "bbb";
    if (strlen(str2) - strlen(str1) > 0)
    {
        printf("str2>str1\n");
    }
    else
    {
        printf("srt1>str2\n");
    }
    return 0;
}

其实它的结果是完全无法预测的

2.VS中库函数的实现

size_t __cdecl strlen (
        const char * str
        )
{
        const char *eos = str;

        while( *eos++ ) ;

        return( eos - str - 1 );
}

3.几种模拟实现strlen函数

3.1遍历法

int my_strlen(const char* str)
{
    int i = 0;
    if (*str !='\0' )
    {
        i++;
        str++;
    }
    return 0;
}

3.2递归法

int my_strlen2(const char* str)
{
    if (*str != '\0')
    {
        return my_strlen(++str) + 1;
    }
}

3.3指针相减等于中间所含元素个数

int my_strlen2(const char* str)
{
    const char* tmp;
    tmp = str;
    while (tmp++);
    return (str - tmp - 1);
}

VS库函数选择的显然是第三种方式。

4.strlen和sizeof

初学者时常会将两者弄混,但其实两者有着有着本质的区别,sizeof是操作符,计算的变量所占的空间大小是多少个字节。strlen是c语言所提供的的库函数,用来统计从传入的地址统计字符串个数,直到遇到\0。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脆皮骷髏人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值