C++中strlen函数的三种实现方法

yizhihongxing

C++中strlen函数的三种实现方法

简介

strlen函数是C和C++中常见的字符串操作函数,用于计算字符串的长度。在C++中,strlen函数有三种实现方法,分别是使用指针、循环和递归。本文将详细说明这三种方法的实现过程和优缺点,帮助读者更好地理解C++中的strlen函数。

方法一:使用指针

使用指针的方式实现strlen函数比较简单,可以通过指针的方式遍历字符串,直到遇到字符串的结束符'\0'为止。实现代码如下:

size_t strlen(const char* str) {
  const char* p = str;
  while (*p != '\0') {
    p++;
  }
  return p - str;
}

在上面的代码中,使用一个字符指针p指向字符串的起始位置,然后循环遍历字符串,直到遇到字符串的结束符'\0',停止循环。最后返回指针p与字符串起始位置str的差值,即为字符串的长度。

这种方法简单明了,速度较快,但是不太适合处理包含多个'\0'结尾的字符串。同时需要注意空字符串的情况。

示例代码:

#include <iostream>
#include <cstring>

size_t my_strlen(const char* str) {
  const char* p = str;
  while (*p != '\0') {
    p++;
  }
  return p - str;
}

int main() {
  char str[] = "hello";
  std::cout << "The length of \"" << str << "\" is: " << my_strlen(str) << std::endl;

  char str2[] = "";
  std::cout << "The length of \"" << str2 << "\" is: " << my_strlen(str2) << std::endl;

  char str3[] = "hello\0world\0";
  std::cout << "The length of \"" << str3 << "\" is: " << my_strlen(str3) << std::endl;

  return 0;
}

输出结果:

The length of "hello" is: 5
The length of "" is: 0
The length of "hello" is: 5

方法二:使用循环

使用循环的方式实现strlen函数也比较简单,可以通过循环遍历字符串,直到遇到字符串的结束符'\0'为止。实现代码如下:

size_t strlen(const char* str) {
  size_t len = 0;
  while (str[len] != '\0') {
    len++;
  }
  return len;
}

在上面的代码中,使用一个变量len记录字符串的长度,然后循环遍历字符串,直到遇到字符串的结束符'\0',停止循环。最后返回变量len的值,即为字符串的长度。

这种方法也比较简单,但是速度较慢,不太适合处理大型字符串。

示例代码:

#include <iostream>
#include <cstring>

size_t my_strlen(const char* str) {
  size_t len = 0;
  while (str[len] != '\0') {
    len++;
  }
  return len;
}

int main() {
  char str[] = "hello";
  std::cout << "The length of \"" << str << "\" is: " << my_strlen(str) << std::endl;

  char str2[] = "";
  std::cout << "The length of \"" << str2 << "\" is: " << my_strlen(str2) << std::endl;

  char str3[] = "hello\0world\0";
  std::cout << "The length of \"" << str3 << "\" is: " << my_strlen(str3) << std::endl;

  return 0;
}

输出结果:

The length of "hello" is: 5
The length of "" is: 0
The length of "hello" is: 5

方法三:使用递归

使用递归的方式实现strlen函数也比较简单,可以通过递归调用函数的方式遍历字符串,直到遇到字符串的结束符'\0'为止。实现代码如下:

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

在上面的代码中,先判断字符串是否为空,如果为空则返回0,否则返回1加上递归调用函数strlen(str+1)的值。递归调用的过程中,每次将字符串指针移动一位,直到遇到字符串的结束符'\0',停止递归。最后返回递归的结果,即为字符串的长度。

这种方法比较巧妙,但是速度较慢,不太适合处理大型字符串。同时需要注意递归深度的问题。

示例代码:

#include <iostream>
#include <cstring>

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

int main() {
  char str[] = "hello";
  std::cout << "The length of \"" << str << "\" is: " << my_strlen(str) << std::endl;

  char str2[] = "";
  std::cout << "The length of \"" << str2 << "\" is: " << my_strlen(str2) << std::endl;

  char str3[] = "hello\0world\0";
  std::cout << "The length of \"" << str3 << "\" is: " << my_strlen(str3) << std::endl;

  return 0;
}

输出结果:

The length of "hello" is: 5
The length of "" is: 0
The length of "hello" is: 5

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

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Java getResource()如何获取class文件目录位置

    Java中的getResource()方法用于从类路径中获取资源,获取资源的路径可以是绝对路径,也可以是相对路径。方法的返回值是一个URL对象。 下面我们来讲解如何使用getResource()方法获取class文件目录位置: 获取class文件所在目录绝对路径 获取class文件所在目录的绝对路径可以使用以下代码: URL url = xxx.class.…

    other 2023年6月27日
    00
  • 魔兽世界3.13(WOW 3.1.3)最新网易客户端 下载

    以下是详细讲解“魔兽世界3.13(WOW 3.1.3)最新网易客户端 下载”的完整攻略: 1. 下载网易客户端 在官方网站上下载网易客户端,网址为 https://dl.w.163.com/163/dl/client/wow/1.0.0/NeteaseWoW.dmg。 打开下载完成的 dmg 文件,并将客户端程序拖放到 Applications 文件夹中。 …

    other 2023年6月25日
    00
  • 技术趋势:React vs Vue vs Angular

    技术趋势:React vs Vue vs Angular 概述 React、Vue、Angular是目前前端开发中最流行的三个JavaScript框架。它们各自具有优缺点,被广泛使用于项目开发中。选择合适的框架可以大大提高开发效率和产品质量。本文将对这三个框架进行详细比较,旨在帮助开发者找到适合自己使用的框架。 React React是由Facebook主导…

    other 2023年6月26日
    00
  • 使用SQL Server分区表功能提高数据库的读写性能

    当涉及到使用SQL Server分区表功能来提高数据库的读写性能时,以下是一个完整的攻略,包含两个示例说明: 1. 创建分区函数和分区方案 首先,我们需要创建一个分区函数来定义如何将数据分布到不同的分区中。例如,我们可以根据日期范围将数据分区。下面是一个示例: CREATE PARTITION FUNCTION DateRangePartitionFunc(…

    other 2023年10月19日
    00
  • .netcore跨平台gui开发之gttksharp初级篇

    .NET Core跨平台GUI开发之GtkSharp初级篇 GtkSharp是一种跨平台GUI工具包,可以用于开发.NET Core应用程序。本文将介绍如使用Sharp进行跨平台GUI开发,包括安和配置GtkSharp、创建窗口和控件、处理事件等。 安装和配置GtkSharp Windows 在Windows上,可以通过以下步骤安和配置GtkSharp: 下…

    other 2023年5月9日
    00
  • oracle(一)执行计划

    当然,我很乐意为您提供有关“Oracle(一)执行计划”的完整攻略。以下是详细的步骤和两个示例: 1 执行计划 执行计划是Oracle数据库中的一个重要概念,它是查询优化器生成的一种计划,用于指导数据库如何执行查询。执行计划可以帮助我们了解查询的执行过程,包括使用哪些索引、如何连接表、如何过滤数据等。 2 执行计划的获取 以下是获取执行计划的方法: 2.1 …

    other 2023年5月6日
    00
  • 完美解决浏览器跨域的几种方法(汇总)

    完美解决浏览器跨域的几种方法(汇总) 在本攻略中,我们将详细讲解几种解决浏览器跨域问题的方法,并提供两个示例说明。 什么是跨域? 跨域是指在浏览器中,当一个网页的脚本试图访问另一个网页的内容时,由于浏览器的同源略,会出现访问被拒绝的情况。同源策略是浏览器的一种安全机制,它限制了一个网页的脚本只能访问同源的内容,即协议、域名和端口号都相同的网页。 解决跨域的几…

    other 2023年5月8日
    00
  • mysql中整数数据类型tinyint详解

    mysql中整数数据类型tinyint详解 简介 在mysql中,tinyint是整数数据类型之一,通常用来存储数值型的数据。本文将详细介绍tinyint的相关知识。 定义 在mysql中,tinyint的定义方式如下: tinyint [ (M) ] [ UNSIGNED ] [ ZEROFILL ] 其中M表示数字的位数,范围为1-255,默认为4;UN…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部