【strlen】三种方法模拟实现strlen字符串函数

简介: 【strlen】三种方法模拟实现strlen字符串函数

13d993ec6c8742a1b6fbed45f749ad48.png

模拟实现“求有效字符长度”的函数my_strlen

由于主函数都一样,现统一给出

int main()
{
char arr[]="abcde";//5个可见(有效)字符
int len=my_strlen(arr);//len接收返回值
printf("%d\n",len);
return 0;
}

方法一:计数器法

int my_strlen(const char*str)
{
 int count=0;
 while(*str++)//先运算后++
  {
  count++;//计数
  }
  return count;
}

备注:此处的函数返回值按照标准理应该size_t也就是unsigned int

返回值为Int 的优缺点:

优点:不会产生由使用size_t(坑坑坑)引发的问题

缺点:不符合size_t类型的返回值的取值范围(数据类型的取值范围)

2104f362400940bd8d1a13d7d2fd55d2.png


运行结果:


c2a01d3cc5b24a8e9f34cc1cc315d0c0.png

const作用:对于不打算修改的变量进行保护,防止被修改。

1.const写给程序员看:自解释,防止后面不小心修改str的值

2.const写给编译器看:一旦修改,立即报错,方便找bug

方法二:函数递归

递归出口:末尾\0

不了解递归:速戳:递归



e48556e39e894bc6b70dbc43ca4b8cd6.png

1277876032864ea691221f9ddc788368.png

int my_strlen(const char* str)
{
  if(*str)
  {
  return 1+my_strlen(str+1);
  }
  else
  {
  return 0;
  }
}

方法三:指针相减法

元素个数=(指针1-指针2)/sizeof(数据类型)

int my_strlen(const char* str)
{
  const char* start = str;//把安全(const)的指针交给安全(const)的指针
  while (*str)
  {
    str++;
  }
  return str - start;
}

以上三种方法都可得出结果5


备注:如果方法三为了优化代码而优化代码写成了这样是有问题的


2f5d2f29267445fe81a59fbc21d2953a.png


解释:

while(str++)中把’\0’放在()内在str==‘\0’的时候,跳出循环前还是会进行从左向右执行最后一次的++操作,然后再跳出;

但是

while(*str)
{
str++;
}

把++放在while的代码块{}内,跳出循环是不会再进行从左向右执行最后一次的++操作,而是直接跳出。


举一个例子验证:


3f1975d160754027b8af116d176195ed.png


但是这个问题可以优化到正确的答案:只用在return 返回值处再减去1


备注:我的博客中还有其他字符串函数的相关模拟实现,快来围观吧!


目录
相关文章
|
6月前
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
56 3
|
6月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现2
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
C语言
strlen函数【详解+模拟实现】
strlen函数【详解+模拟实现】
|
6月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
|
1月前
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)
30 0
|
1月前
|
存储 C语言 数据格式
解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)
解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)
19 0
|
6月前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
6月前
|
Java 编译器 C语言
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
45 0
|
6月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
6月前
|
存储 编译器 C语言
strlen函数详解
strlen函数详解
200 2