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

字符串和内存函数(1)

strcat函数

如上图,strcat函数就是将一个字符串拼接在另一个字符串后面,第一个参数是目标字符串,第二个参数是源字符串,strcat的返回值是目标字符串的起始地址。

注意:1.目标空间必须足够大,还需要可以修改。

           2.目标空间必须得有\0(保证能找到目标空间的末尾)

           3.原字符串中也得有\0,在拷贝时将源字符串中的\0也拷贝过去。

如下图,准备拷贝时在目标字符串第一个\0的位置就开始拷贝。

下方代码是模拟实现strcat函数,请读者自行理解。

char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);//找到目标空间的末尾while (*dest != '\0')dest++;//数据追加while (*dest++ = *src++);return ret;
}

 strcmp函数

如上图,strcmp函数是用来比较两个字符串相对位置的字符的ASCII的大小的,如果相对位置的大小相同,就往后一位比较,直到有大小不同的字符就停止比较。

返回值如下:1.当参数1大于参数2,返回大于0的数。

                      2.当参数1等于参数2,返回0。

                      3.当参数1小于参数2,返回小于0的数。

下方是模拟strcmp函数的实现。

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}

strncpy函数

 如上图,strncpy函数比strcpy函数多了一个参数,参数3是指参数2字符串拷贝的字符个数,在拷贝时,不会将参数2字符串末尾的\0拷贝过去。如果参数3的个数超过参数2的字符个数会发生什么呢?

 如上图,超过的部分会自动补\0,所以最终只会打印abc。

strncat函数

如上图,strncat函数的参数3跟strncpy的参数3类似,都是指个数,不过在拷贝时,会自动拷贝一个\0在末尾。

 ctrncmp函数

如上图, strncmp的参数3也是指个数,指的是两个字符串前num个相对位置的字符的大小,因为前三个字符都一样,所以返回值是0。

当个数是4时,前3个字符的大小一样,比较的就是d和q,q比d大,就返回小于0的数。

 strstr函数

strstr会返回str1中str2第一次出现的位置,如果str1中没有str2,就返回NULL。strstr是一个在字符串中找字符串的函数。 

下方是strstr函数的模拟实现和运行结果。

const char* my_strstr(const char* str1,const char* str2)
{const char* cp;//记录开始匹配的位置const char* s1;//遍历str1指向的字符串const char* s2;//遍历str2指向的字符串assert(str1 && str2);if (*str2 == '\0')return str1;  cp = str1;while (*cp){s1 = cp;s2 = str2;while (*s1&&*s2&&*s1 == *s2){s1++;s2++; }if (*s2 == '\0')return cp;cp++;}return NULL;
}int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";const char* ret = my_strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("%s\n", ret);return 0;
}

 

分析:为了不改变原始数据,我们创建了另外3个指针, cp指向str1的起始位置,s1用来遍历str1指向的字符串,每次循环结束(即查找失败)时,cp++使cp指向str1的下一位,再把cp赋给s1。s2用来遍历str2指向的字符串,每次循环结束,就要使s2回到str2的起始位置。内层while的条件中*s1&&*s2用来判断他们是否已经遇到\0,如果遇到则停止,*s1==*s2用来判断相对应的字符是否相同,相同则继续。当*s2==\0时表明s2已经到str2的末尾了,说明已经在str1中找到和str2一样的字符串了,这时就可以直接返回此时cp的位置。还有一种特殊的情况,等str2时空字符串时,即"",我们直接返回str1的起始地址,因为空集是任何一个集合的子集。

 

相关文章:

  • 基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查
  • 【漏洞复现】速达软件存在任意文件上传
  • 《内蒙古自治区“十四五”能源发展规划》明确提出,重点打造()、 阿拉善盟和内蒙古东部的通辽市等地区千万千瓦级风电基地。
  • 虹科案例 | OPC UA SDK快速扩展VIMANA智能制造软件连接性
  • 代码随想录刷题题Day5
  • ultralytics yolo图像分类训练案例;pytorch自有数据集图像分类案例
  • SpringBoot整合MongoDB
  • 使用com组件编辑word
  • 【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现
  • Android wifi 框架以及Enable流程
  • 第八节HarmonyOS @Component自定义组件的生命周期
  • ubuntu虚拟机设置跳不出来
  • 【Rust】所有权的认识
  • 华为 ArkTS 边框怎么设置,当边边框怎么设置(鸿蒙开发)
  • 模拟电路学习笔记(一)之芯片篇(持续更新)
  • 网络传输文件的问题
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【技术性】Search知识
  • angular组件开发
  • Babel配置的不完全指南
  • CODING 缺陷管理功能正式开始公测
  • HTML中设置input等文本框为不可操作
  • IndexedDB
  • iOS 颜色设置看我就够了
  • IOS评论框不贴底(ios12新bug)
  • iOS小技巧之UIImagePickerController实现头像选择
  • JSDuck 与 AngularJS 融合技巧
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • mongo索引构建
  • orm2 中文文档 3.1 模型属性
  • passportjs 源码分析
  • Python连接Oracle
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 第2章 网络文档
  • 计算机在识别图像时“看到”了什么?
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 《码出高效》学习笔记与书中错误记录
  • #define用法
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (30)数组元素和与数字和的绝对差
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (数据结构)顺序表的定义
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)LINQ之路
  • (转)Linux整合apache和tomcat构建Web服务器
  • ***通过什么方式***网吧
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core 6 集成 elasticsearch 并 使用分词器