模拟实现strlen的三种方法

一、strlen()的工作原理

二、模拟实现strlen的三种方法

  1. 计数器方法
  2. 指针-指针
  3. 递归的方法

三、库函数实现strlen的思路

四、库函数的strlen同上面模拟实现strlen的区别

一、strlen工作原理

strlen函数工作原理:是计算字符串str的长度,直到空字符串结束,但不包含空字符串。(即该长度算至/0结束,但不包含/0)

通过以下代码能有一个直观的感受:

int main(){
  char arr[]="abcdef";
  int len=strlen(a);//"abcdef"即  'a' 'b' 'c' 'd' 'e' 'f' '\0'
                          //计算的是'\0'之前的元素个数
  printf("%d\n",len);     // 输出结果为6
  return 0;  

}

模拟实现strlen的三种方法

以上则为strlen的工作原理

即strlen计算的是字符串内'\0'之前的元素个数。(不包含'\0')

二、模拟实现strlen的三种方法

  1. 计数器方法
  2. 指针-指针
  3. 递归的方法

我们通过上述得知strlen的工作原理,那么我们接下来根据其工作原理实现strlen.
共有以下三种方式去实现:

ps:只有sizeof(数组名)&(数组名),此时代表的是整个数组的地址,其余时候
数组名 仅仅代表首元素地址。在本文中,数组名 只代表首元素地址。

int my_strlen(){}    //要实现的功能,如下三种方式
int main(){
  char arr[]="abcdef";
  int len=my_strlen(a);                      
  printf("%d\n",len);     
  return 0;  

}

1.计数器方式(创建了临时变量)

思路如下:将arr传递到my_strlen中,我们创建一个变量 count ,当 *arr!=0 时则 count +1, arr也+1 ,此时 *arr='b' ,arr和count再同时+1, 直到 *a=='\0'时,
我们返回 count 的值,此时的 count 的值为元素的个数。

图解如下:
模拟实现strlen的三种方法

算法如下:

int my_strlen(const char *str){
  int count=0;
  while(*str!='\0'){    //当为'\0'时,即while(0),条件为假,退出循环
    count++;
    str++;
}
  return count;
}

2.指针-指针(创建了临时变量)

思路如下:创建指针p指向arr,当p!='\0'时,p加上1,直到p='\0',用
指针p-指针arr,此时的指针p代表的是'\0'的地址,指针arr代表的是首
元素地址,两者相减得到的值为两地址之间的元素个数。

图解如下:
模拟实现strlen的三种方法

当p走到'\0'的地址时, p-arr=元素的个数

实现代码如下:

 int my_strlen(const char*str){
   const char*p=str;

   while(*p){
     p++;
 }
   return p-str;
}

3.递归(不创建临时变量)
思路如下:通过递归的思想。

图解吐下:
模拟实现strlen的三种方法

ps:递归的基本思想是把一个大型复杂的问题层层转化为一个与原问题相似的规
模较小的问题来求解。

算法如下:

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

三、参考库函数如何实现strlen

模拟实现strlen的三种方法

对比自身用指针实现strlen,代码更为简洁,将 while(*p){p++;} 精简为
while(*p++);

图解如下:
模拟实现strlen的三种方法

ps:如何查看库函数实现strlen。可看链接:如何查看库函数实现的某些函数(strlen,strcmp,strcpy等)

四、库函数的strlen同上面模拟实现strlen的区别

可通过如下代码进行区别:

#include<string.h>
#include<stdio.h>
int main(){
    if(strlen("abc")-strlen("abcdef")>0)
    {printf("hehe\n");
        }
     else
        {printf("haha\n");
        }
}

很显然,我们应该是打印 haha,但结果是hehe,为什么打印的是hehe
因为在strlen()的函数声明如下:size_t strlen(const char*str)

定义的类型是size_t,那么size_t又是什么类型
通过如下操作可知:
模拟实现strlen的三种方法

可知size_t是无符号整型,于是:无符号整型-无符号整型=无符号整型
于是打印的是hehe

我们模拟实现函数strlen返回的是int,于是当我们
调用my_strlen时,打印的便是haha,效果如下
模拟实现strlen的三种方法

原文链接:https://www.cnblogs.com/zzao/p/17128270.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:模拟实现strlen的三种方法 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解 为什么文件操作很重要? 文件操作是C语言开发必不可少的一部分。在C语言中,文件可以被用作数据存储和读取,以便在程序中传递和处理数据。这使得文件操作成为C语言中最重要的基础和必备知识之一。 文件操作的基本概念 C语言中,文件可以被看做一个sequence of bytes。C语言操作文件主要基于以下三个基本概念: 文件指针:文件…

    C 2023年5月23日
    00
  • C语言图书借阅系统源码

    C语言图书借阅系统是一个非常基础的实现管理图书的系统,通常包含图书的信息、借阅状态等要素。以下是完整的攻略: 1. 系统功能设计 1.1 系统界面设计 考虑到C语言的控制台界面较为基础,因此可以采用类似以下的控制台菜单交互方式: 欢迎使用图书借阅系统 1. 添加图书信息 2. 显示图书信息 3. 借阅图书 4. 归还图书 5. 统计图书信息 6. 退出 请选…

    C 2023年5月22日
    00
  • Golang 的defer执行规则说明

    当前站点为标准的Markdown格式化文本提供支持。Markdown是一种轻量级的标记语言,通常由程序员和写作者使用,以便轻松将文本转换为HTML。 Golang 的defer执行规则说明 什么是defer defer是Golang中一个非常有用的关键字,用于确保函数调用在程序执行完当前代码块之后执行。defer被经常用于处理控制流,资源清理等任务,它为代码…

    C 2023年5月23日
    00
  • Java异常链表throw结构assert详细解读

    请看下面的详细讲解: Java异常链 Java中的异常链是指,当一个异常被抛出时,可能会引发另一个异常。这个被引发的异常可以包含原始异常的信息。这种机制称为异常链。 在Java中,异常链可以通过调用getCause()方法来获得。该方法返回一个Throwable对象,该对象是造成当前异常的原因。如果没有原因,则返回null。 public class Exc…

    C 2023年5月23日
    00
  • C++ 通过pqxxlib库链接 PostgreSql数据库的详细过程

    C++ 是广泛使用的编程语言之一,与后端的数据库管理息息相关。其中,PostgreSQL 是一个功能齐全的开源对象-关系数据库管理系统,被广泛应用于 Web 应用程序的数据存储。在 C++ 中,通过使用 pqxxlib 库的链接,可以很方便地访问并操作 PostgreSQL 数据库。 下面是 C++ 通过 pqxxlib 库链接 PostgreSQL 数据库…

    C 2023年5月22日
    00
  • Java爬虫 信息抓取的实现

    Java爬虫可以通过模拟浏览器的行为,自动化地访问网页并抓取所需信息,主要分为以下几个步骤: 1. 简述Web爬虫的基本工作流程 1.1 网页访问 要抓取的信息一般都在网页中,因此第一步是访问目标网站。由于Java爬虫需要模拟浏览器的行为,因此一般使用java.net.HttpURLConnection或org.apache.http.client.Http…

    C 2023年5月23日
    00
  • C语言+MySQL实现推箱子游戏

    C语言+MySQL实现推箱子游戏攻略 1. 实现思路 推箱子游戏是一款比较经典的游戏,本次通过使用C语言和MySQL数据库,实现游戏的记录和排行榜功能。 实现思路分为以下几步:1. 首先需要创建MySQL数据库,包含两张表,分别记录玩家信息和游戏记录信息;2. 使用C语言编写游戏程序,并实现连接MySQL数据库的功能;3. 玩家每次完成游戏后,将游戏记录信息…

    C 2023年5月22日
    00
  • Win10 TH2正式版升级遇到错误0xC1900101的临时解决办法

    Win10 TH2正式版升级遇到错误0xC1900101的临时解决办法 问题描述 在升级Win10 TH2正式版时,可能会遇到错误代码为0xC1900101的错误,这一错误通常意味着升级过程中出现了不兼容的硬件、软件或者驱动程序。在此情况下,升级过程无法顺利完成,需要采取一些措施解决这一问题。 临时解决办法 1. 删除不兼容的驱动程序 可能任何一个不兼容的驱…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部