Strlen与sizeof的区别以及strlen多种方式的实现

#####目录

     1 Strlen 函数的有关

     2  与sizeof的区别

     3Strlen 函数的实现

相信大多数初学者和我一样迫切想知道这个库函数的前世今生 那么 2000字带你真正了解它

1 关于Strlen

Strlen是C语言中的一种用于求字符串长度的函数 ( Str由string取来 len 由length得来)               他从第一个字符开始读取 直到读到 \0结束,所计算的字符串大小为‘\0’以前的字符所计算的值,最终的字符串长度不包括‘\0’

strlen因为是一种函数,因此调用这个函数需要引用的头文件是<string.h>,它的原型是size_t strlen(const char* str);str表示的是需要计算长度的字符串,由此看出传参的时候应该传的是一个地址而不是一个数值

标题

形象的表达就是这个样子 字符串A到F 当读完最后一个字符F时 读取到斜杠0结束 字符串的长度就只有6而不是7 (这和sizeof有区别 后文讲述)

了解作用原理之后 那他具体该如何使用呢

以下面一段代码为例

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "abcdef";
    printf("%d\n", (strlen(arr)));
    return 0;

}
 

这里的strlen就用来求arr数组长度  输出结果就应该是6

这里先简单区分一下Strlen  和  sizeof 的区别

顾名思义 strlen (string length)用于求字符串长度

                sizeof ( the size of) 用于求字符串所占内存空间的大小

两者的最大区别就是这里 

最直观的表现就是 strlen 不算斜杠0 而sizeof要算斜杠0 

其最主要原因也就是两者定义不同 字符串长度不包含这个斜杠0 转义字符  就是人看到是几个字符就是几个字符, 而sizeof 中斜杠0 也确确实实存在于内存空间中 占据了内存的空间 所以在计算 字符串所占空间大小的时候就要算

举个栗子

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[] = "abcdef";

    printf("%d\n", (strlen(arr)));
    printf("%d\n", (sizeof(arr)));
    return 0;

}

输出的值到底是多少呢?

相信你已经清楚的知道了 分别为6 和7。

了解了他们的区别

下面一起来看Strlen的实现吧

方法一:

按照定义直接法

#include<stdio.h>
#include<assert.h>
int My_strlen( const char* ch)
{
    int count = 0;
    assert(ch != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
    while (*ch != '\0')
    {
        ch++;
        count++;
    }
    return count++;

}


int main()
{
    char arr[] = "  abysfghk";
    int len=My_strlen(arr);
    printf("%d", len);
}

//这边说明一下最好把打印len放在下边 可移植性更强一点 上边函数的实现就是单纯的实现

注意传参的时候arr 数组名表示首元素地址  所以更应该用指针变量去接收这个地址

 第二种方式 函数的递归

原理如下 

若char[]="abc"则可以写成如下

1+my_strlen("bc")

1+1+my_strlen("c")

1+1+1+my_strlen("")--------1+1+1+0(空字符串第一个字符就是'\0')

代码如下

#include<stdio.h>
#include<assert.h>
int My_strlen( const char* ch)
{
    
    assert(ch != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
    if (*ch!='\0')
    {
        return 1 + My_strlen(ch + 1);//这里的加1表示读取下一位
    }
    else
    {
        return 0;
    }
}

#include<stdio.h>
#include<assert.h>
int main()
{
    char arr[] = "  abysfghk";
    int len=My_strlen(arr);
    printf("%d", len);
}
 

具体注意2点

首先是此处的if else语句的作用为判断是否这个数组有字符

如果没有就直接 return 0

其次 My_strlen(ch + 1) 表示读取下一位

方法三 指针减指针

用指针相减直接计算

两个指针相减,得到的是两个指针之间元素的个数 所以只要用字符串收尾两个指针相减就是整个字符串长度

例子如下

#include<stdio.h>
#include<assert.h>
int My_strlen( const char* ch)
{
    const char* start = ch;
    assert(ch != NULL);//p如果接收过来的是空指针,那么这里运行会崩溃的,所以这里用assert函数断言一下
    while (*ch!='\0')
    {
        ch++;
    }
    return ch - start;
}

#include<stdio.h>
#include<assert.h>
int main()
{
    char arr[] = "  abysfghk";
    int len=My_strlen(arr);
    printf("%d", len);
}
 

这就是三种实习方法啦

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值