模拟实现strlen的三种方法

yizhihongxing

一、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日

相关文章

  • Objective-C和Swift的转换速查手册(推荐)

    作为网站作者,我们提供了一份Objective-C和Swift的转换速查手册,可以帮助开发者快速了解两种语言之间的相互转换规则。以下是手册的完整攻略: 什么是Objective-C和Swift的转换速查手册? Objective-C和Swift是苹果公司官方推出的两种主要开发语言,然而两者之间的语法和语义存在一定的差异,导致不同版本之间的代码转换比较困难。为…

    C 2023年5月22日
    00
  • C语言与JAVA的区别是什么(推荐)

    C语言与JAVA是两种常见的编程语言,它们在很多方面有不同的特点和区别。下面我将详细讲解C语言与JAVA的区别,包括语言特性、编译方式等,以及两条实例说明。 C语言与JAVA的区别 1. 语言特性 C语言是一种过程式编程语言,它着重于程序的执行顺序和对计算机硬件的直接控制。C语言中没有类和对象的概念,很多特性需要手动实现。而JAVA是一种面向对象的编程语言,…

    C 2023年5月23日
    00
  • 贪心算法的C语言实现与运用详解

    贪心算法的C语言实现与运用详解 什么是贪心算法 贪心算法是指在求解问题时,采取每一步的最优解,以使最终结果最优的一种算法。换句话说,贪心算法在解决问题时会选择当前最优解,而不考虑可能影响未来的选择。 贪心算法的实现步骤 贪心算法的实现步骤如下所示: 将问题转化为贪心选择性质的形式。 通过选择最优解来求解子问题。 通过剪枝技巧来减少寻找最有结果的时间和空间复杂…

    C 2023年5月22日
    00
  • C++如何用数组模拟链表

    C++可以用数组来模拟链表的数据结构,这种方法也被称为静态链表。下面是模拟链表的完整攻略: 1.创建一个数组,并初始化每个元素。数组中的每一项包括两个数据值:数据和指针。其中数据存储着当前节点的值,指针存储着下一个节点在数组中的索引值。 struct Node{ int value; //当前节点的值 int next; //下一个节点在数组中的索引值 }n…

    C 2023年5月23日
    00
  • C语言中调用汇编语言详解

    C语言和汇编语言是近年来广泛应用于硬件控制、系统底层控制、嵌入式系统等方面的编程语言,由于汇编语言能够直接访问和控制硬件资源,所以在需要对硬件进行底层控制时,常常需要用到汇编语言编写的程序。作为高级语言代表的C语言,也能够和汇编语言进行良好的协同工作。下面将讲解如何在C语言中调用汇编语言。 1.编写汇编程序 在C语言程序中调用汇编语言程序,首先需要编写一个汇…

    C 2023年5月23日
    00
  • YOGA C740和YOGA C940应该如何选择 YOGA C740和YOGA C940详细评测对比

    YOGA C740和YOGA C940应该如何选择 硬件配置 YOGA C940和YOGA C740在硬件配置上有一定的差异,如下所示: 参数 YOGA C740 YOGA C940 CPU Intel i5/i7 Intel i7/i9 内存 8/12/16GB 8/12/16GB 存储 256/512/1TB 256/512/1TB 显卡 NVIDIA …

    C 2023年5月23日
    00
  • C++实现strcpy函数实例

    C++实现strcpy函数实例 什么是strcpy函数 strcpy是C/C++中非常常用的字符串复制函数,用于将一个字符串复制到另一个字符串中。其函数原型如下: char* strcpy(char* dest, const char* src); 其中,dest是目标字符串指针,src是源字符串指针。 实现strcpy函数的步骤 计算源字符串的长度n 申请…

    C 2023年5月23日
    00
  • 简单的汉诺塔问题解法代码

    汉诺塔问题是一道常见的算法问题,它涉及到递归算法的应用。在这道问题中,我们需要把一个塔从第一个柱子移动到第三个柱子上,移动的过程中需要遵循以下几个规则: 每次只能移动一个盘子 任何时候,大盘子都不能放在小盘子上面 下面提供一个标准的解法代码: void hannoi(int n, char A, char B, char C) { if (n == 1) {…

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