当前位置: 首页 > news >正文

string模拟实现find

个人主页:Jason_from_China-CSDN博客

所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客

所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客

 string模拟实现find

查找分为查找字符和查找字符

查找字符的实现:

	//find查找字符+find查找字符串(strstr暴力查找)size_t string::find(char ch, size_t pos){for (size_t i = pos; i < _size - pos; i++){if (_str[i] == ch)return i;}return npos;}

代码解释:

  1. 这里查找字符我们采取的是暴力查找,找到了,直接返回找到的下标,没找到直接返回npos,也就是一个很大是数值


 

查找字符串的实现:

查找字符串我们可以使用一个库函数来实现,暴力实现的讲解有点复杂,所以我们直接使用strstr的函数实现

size_t string::find(const char* str, size_t pos)
{assert(pos >= 0 && pos <= _size);const char* ptr = strstr(_str + pos, str);if (ptr == nullptr){return npos;}else{//正确计算位置索引:ptr是在_str + pos所指向的内存区域中找到子字符串str时的指针。通过ptr - _str,可以计算出子字符串在整个_str字符串中的起始索引位置。//将指针ptr强制转换为size_t类型并返回,并没有实现find函数预期的功能。find函数的目的是返回子字符串在原字符串中的位置索引(一个基于 0 开始的偏移量),而不是指针值的数值表示。//简单的说就是,这个ptr是指针类型,但是我们这个函数的接口是size_t类型//所以我们需要转化为size_t类型的,但是还不能直接强制类型转化//因为指针强制类型转换计算偏移量是从0开始是,所以就会导致报一个很大的数值//我们需要计算偏移量,那么我们知道的偏移量就是_str首元素的地址也就是0//此时任何数值-0都等于那个数值本身,所以我们计算出结果。return ptr-_str;}
}

代码解释:

  1. 这里的关键在于,strstr的数值的接收,这里返回的是一个指针,但是我们的返回值一个是一个size_t类型的
  2. 此时就会产生无法返回的情况,那么我们就有两种解决办法,要么是强制类型转换,要么是减去相对地址
  3. 但是强制类型转化的行不通的,因为我们强制类型转换的时候,我们拿到的是绝对地址,但是实际上我们需要的是相对地址
  4. 所以我们需要ptr-_str这个是ptr-0,也就是得出相对地址位置

 


http://www.mrgr.cn/news/67042.html

相关文章:

  • 六个核桃斥资千万研究脑健康,核桃健脑作用科学具象化了
  • SpringBoot配置Rabbit中的MessageConverter对象
  • 01简介——基于全志V3S的Linux开发板教程笔记
  • 信息安全工程师(78)网络安全应急响应技术与常见工具
  • 对比JavaScript、C、Python在声明变量后未初始化处理上的差异与深度解析
  • springboot-Ioc-Di
  • 内网渗透-信息收集篇
  • 输入/输出系统
  • 呼叫中心如何安排用户回访?
  • 编译工具与文件学习(一)-YAML、repos、vcstoolcolcon
  • NoSQL基础知识总结
  • xftp连接中不成功 + sudo vim 修改sshd_config不成功的解决方法
  • Linux 高级IO
  • sqli-labs(第三关)
  • 全流程揭秘:如何打造一个虚拟3D展厅?
  • memcache redis区别
  • 支持向量机相关证明 解的稀疏性
  • 如何解决反向代购业务中的物流难题?
  • 拦截器获取controller上的自定义注解
  • 代码随想录 | Day38 | 动态规划 :01背包应用 目标和一和零