三种方法模拟实现库函数strlen,加深对strlen的理解

简介: 三种方法模拟实现库函数strlen,加深对strlen的理解

一.对库函数strlen的理解



在cplusplus网站上搜索strlen

2e99ac288f2c4b7eac81d853fb7566e5.png


通过对在网站上对strlen的检索可以知道,strlen以下信息

1.这是一个只负责字符串的库函数!

2.计算的是字符串 \0 之前的长度,不包括\0

3.传入的参数只能是指针

4.返回的类型是size_t类型,本质是unsigned int类型


二.模拟实现库函数strlen



1.计数器法


//1.计数器法
//将字符串的地址传入,找到字符串中每一个不为零的字符并统计
#include<assert.h>
#include<stdio.h>
#include<string.h>
//防止源头字符串被修改,用const修饰
size_t my_strlen(const char* str)
{
  assert(str);//断言传入为非空指针
  int count = 0;//计数器
  while (*str++) //不为零的字符
  {
    count++;
  }
  return count;
}
int main()
{
  char arr[] = "abcdef";
  size_t len=my_strlen(arr);
  printf("%u", len);//由于是模拟strlen,返回类型是size_t,因此用%u打印
  return  0;
}


2.递归法


//2.递归法
 #include<assert.h>
 #include<stdio.h>
size_t my_strlen(const char* str)
{
    assert(str);//断言传入为非空指针
  if (*str == '\0') //控制条件,直到找到了 \0 停止递归
    return 0;
  else  //第一个字符不是\0,长度加 1,并向下找下一个字符
    return 1 + my_strlen(str + 1);
}
int main()
{
  char arr[] = "abcdef";
  size_t len = my_strlen(arr);  //size_t 本质为unsigned int类型
  printf("%u", len);
  return 0;
}


3.指针法


//3.指针相减法
//找到字符串起始位置和\0的位置
//指针与指针相减为中间元素个数
#include<assert.h>
#include<stdio.h>
size_t my_strlen(const char* str)
{
  assert(str);//断言传入的str为非空指针
  char* p = str;//记录起始位置
  //寻找\0得位置
  while (*p)
  {
    p++;
  }
  return p-str;  //指针相减为中间元素得个数
}
int main()
{
  char arr[] = "abcdef";
  size_t len = my_strlen(arr);
  printf("%u", len);
  return 0;
}


三.strlen的一些特殊情况



1.字符串中间添加 \0 相当于截断字符串 \0后面的内容


#include<assert.h>
size_t my_strlen(const char* str)
{
  assert(str);
  char* p = str;//记录起始位置
  //寻找\0得位置
  while (*p)
  {
    p++;
  }
  return p-str;  //指针相减为中间元素得个数
}
#include<stdio.h>
int main()
{
  char arr[] = "abc\0ef";
  size_t len = my_strlen(arr);
  printf("%u", len);
  return 0;
}


运行结果为:


9d42e51421934bcdb58e2a5581430d05.png


相关文章
|
C语言
strlen函数【详解+模拟实现】
strlen函数【详解+模拟实现】
|
C语言
你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)
你应该知道的C语言干货(2)(strlen和strcpy的模拟实现)
61 0
|
C语言
模拟库函数strcpy
关于库函数strcpy()的详细内容,跳转文章:《C语言:字符串拷贝函数strcpy()》
38 0
|
C语言
【C语言】memcpy函数和memmove函数使用和模拟实现
【C语言】memcpy函数和memmove函数使用和模拟实现
94 0
|
6月前
|
编译器 C语言
详解sizeof()和strlen()的细节及用法
详解sizeof()和strlen()的细节及用法
47 1
详解sizeof()和strlen()的细节及用法
|
6月前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
40 1
|
7月前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
73 0
|
7月前
|
C语言
【C语言】模拟strcpy函数的实现
【C语言】模拟strcpy函数的实现
50 0
模拟实现库函数strlen
模拟实现库函数strlen
32 0