遥遥领先的内存函数

目录

​编辑

函数介绍

1.1 strlen

1.2 strcpy

1.3 strcmp

1.4 strcat

1.5 strstr

2.1 memcpy

2.2 memmove

2.3 memcmp

函数实现

1.1 strlen

1.2 strcpy

1.3 strcmp

1.4 strcat

1.5 strstr

2.1 memcpy

2.3 memcmp


函数介绍

1.1 strlen

size_t strlen ( const char * str );

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。 包含空格

参数指向的字符串必须要以 '\0' 结束。

函数的返回值为size_t,是无符号的。

strlen用于计算字符串长度   而sizeof()用于计算大小  只关注括号内的类型 

1.2 strcpy

char* strcpy(char * destination, const char * source );

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷贝到目标空间。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变

返回值为char*  记录着复制前的destination地址

1.3 strcmp

int strcmp ( const char * str1, const char * str2 );

第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字

根据字符的ASCALL码值进行比较

1.4 strcat
 

char * strcat ( char * destination, const char * source );

源字符串必须以 '\0' 结束。

目标空间必须有足够的大,能容纳下源字符串的内容。

目标空间必须可修改。

1.5 strstr

char * strstr ( const char *str1, const char * str2);

返回指向str1中第一个出现的str2的指针   如果找不到则返回空指针

2.1 memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

这个函数在遇到 '\0' 的时候并不会停下来。

如果source和destination有任何的重叠,复制的结果都是未定义的。

函数的指针类型使用了void* 类型进行接受  void* 指针不能进行计算 

故在实现函数时需要进行强制转换  强制转换为 char* 类型  char* 类型遍历为一字节 精度最细  适用于所有类型的复制

2.2 memmove

void * memmove ( void* destination, const void * source, size_t num );

memmove根据   dest与src的位置   区分为两种交换方式

dest在src前   前 -> 后                       其余情况    后 ->前

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

如果源空间和目标空间出现重叠,就得使用memmove函数处理

2.3 memcmp

int memcmp ( const void * ptr1,const void * ptr2,size_t num );

比较从ptr1和ptr2指针开始的num个字节

返回值比较情况
<0          ptr1 < ptrr2
0ptr1 = ptrr2
>0ptr1 > ptrr2

函数实现

1.1 strlen

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <string.h>int my_strlen(const char* str)
{int count = 0;while (*str){str++;count++;}return count;}int main()
{char arr[] = "abcdef";printf("%d",my_strlen(arr));return 0;
}

1.2 strcpy

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>char* my_strcpy(char* des, const char* src)
{char* temp = des;assert(des != NULL);assert(src != NULL);while (*src){*des = *src;des++;src++;}*des = *src;   //将\0拷贝return temp;}int main()
{char arr1[] = "aacd";char arr2[] = "xxx";my_strcpy(arr1, arr2);printf("arr2:%s\narr1:%s", arr2, arr1);return 0;}

1.3 strcmp

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int my_strcmp(const char* str1, const char* str2)
{while (*str1 == *str2){if (*str1 == "\0"){return 0;}str1++;str2++;}if (*str1>*str2){return 1;}else{return -1;}}int main()
{char arr1[] = "bbbbb";char arr2[] = "abce";printf("%d", my_strcmp(arr1, arr2));return 0;
}

1.4 strcat
 

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>char* my_strcat(char* des, const char* src)
{assert(des);assert(src);char* temp = des;while (*des){des++;}while (*src){*des++ = *src++;}return temp;}int main()
{char arr1[30] = "Hello World";char arr2[] = "acbde";my_strcat(arr1, arr2);return 0;
}

1.5 strstr

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>char* my_strstr(char* str1 , char* str2)
{char* cp = str1;char* s1 = cp;char* s2 = str2;if (*str2 == "\0"){return 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[] = "abcbbcdaaa";char arr2[] = "bbc";char* ret = my_strstr(arr1, arr2);if (ret!=NULL){printf("%s\n", ret);}else{printf("找不到\n");}return 0;
}

2.1 memcpy

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>//函数拷贝结束后,返回目标空间的起始地址  //void* 不能运算 要强转
void* my_memcpy(void* des, const void* src, int num) //num单位是字节
{void* ret = des;assert(src && des);while (num--){*(char*)des = *(char*)src;//强制类型转换时临时的  以下写法某些编译器无法通过//((char*)des)++;   //((char*)src)++;des = (char*)des + 1;src = (char*)src + 1;}return ret;}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = {0};char arr3[] = "abcde";char arr4[10] = {0};my_memcpy(arr2,arr1,20);my_memcpy(arr4,arr3, 3);int i = 0;for ( i = 0; i < 10; i++){printf("%d ", arr2[i]);}printf("\n");int j = 0;for (i = 0; i < 10; i++){printf("%c ", arr4[i]);}return 0;
}

2.3 memcmp

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest && src);void* ret = dest;int i = 0;if (dest < src)    //前 - > 后  拷贝{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else  	//后 -> 前{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;}int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };// 3 4 5 6 7 6 7 8 9 10   char arr3[] = "abcde";//cdedemy_memmove(arr1, arr1+2, 20);my_memmove(arr3, arr3+2, 3);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}printf("\n");printf("%s", arr3);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS CoreMotion获取传感器数据

CoreMotion是iOS系统目前用于处理加速度计&#xff0c;陀螺仪&#xff0c;计步器和环境相关事件。 Core Motion的报告来自iOS设备的板载硬件的运动和环境相关数据&#xff0c;包括加速度计和陀螺仪&#xff0c;以及计步器&#xff0c;磁力计和气压计。 为了以特定的时间间隔接…

SpringBoot整合Redis,基于Jedis实现redis各种操作

前言&#xff08;三步教你学会redis&#xff0c;主打一个实用&#xff09; springboot整合redis步骤&#xff0c;并基于jedis对redis数据库进行相关操作&#xff0c;最后分享非常好用、功能非常全的redis工具类。 第一步&#xff1a;导入maven依赖 <!-- springboot整合re…

小程序代码管理

“微信开发者工具”点击版本管理&#xff0c;然后点击代码管理会打开代码管理网页。 选择对应的项目组。 进来后点击创建项目。 输入git名称&#xff0c;然后选择命名空间&#xff0c;最后创建即可。 在刚才的“微信开发者工具”选择设置&#xff0c;然后添加远程。 输入名称&…

朋友圈大佬都去读研了,这份备考书单我码住了

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

pycharm安装jupyter,用德古拉主题,但是输入行全白了,看不清,怎么办?

问题描述 今天换了以下pycharm主题&#xff0c;但是jupyter界面输入代码行太白了&#xff0c;白到看不清楚这行的字&#xff0c;更不知道写的是什么&#xff0c;写到哪了&#xff0c;这还是挺烦人的&#xff0c;其他都挺正常的。 问题分析 目前来看有两个原因&#xff1a; 1、…

【新版vscode配置自动补全括号】

vscode新版配置自动补全括号方法 新版配置方法(Pylance) ①设置 -> 扩展 -> Pylance -> 将 python.analysis.completeFunctionParens 下方的选项打勾 ②直接在settings.json中添加"python.analysis.completeFunctionParens": true

【Apollo】自动驾驶技术的介绍

阿波罗是百度发布的名为“Apollo&#xff08;阿波罗&#xff09;”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。 帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…

vue3 - setup之defineEmits

基础形式 子组件 const emits defineEmits([name])//触发emits事件 const eventButton () > {emits(name) }父组件 <script> const handleName () >{ } </script> <template><ComponentName name"handleName" /> </template>…

如何评估ChatGPT的语言多样性和方言识别能力?

评估ChatGPT的语言多样性和方言识别能力是重要的&#xff0c;特别是在处理全球性用户群体和多语种社区的情况下。这需要综合考虑ChatGPT的能力来理解、生成和适应不同语言和方言。在这篇回答中&#xff0c;我将详细讨论如何评估ChatGPT的语言多样性和方言识别能力&#xff0c;并…

ros2 学习launch文件组织工程 yaml配置文件

简单范例 功能描述 使用launch文件&#xff0c;统一管理工程&#xff0c;实现img转点云&#xff0c;发送到img_pt的topic&#xff0c;然后用reg_pcl节点进行subscribe&#xff0c;进行点云配准处理&#xff0c;输出融合后的点云到map_pt的topic。最后由rviz2进行点云展示。 …

CSS - 快速实现悬浮吸顶,当页面滑动一定距离时固定吸附在顶部(position: sticky)

效果图 如下图所示&#xff0c;利用 position: sticky 属性轻松实现。 示例代码 新建一个 *.html 文件&#xff0c;一键复制运行起来。 <body><section class"content"><div class"item">我是悬浮吸顶区域</div><h1>我是…

AI时代:探索机器学习与深度学习的融合之旅

文章目录 1. 机器学习和深度学习简介1.1 机器学习1.2 深度学习 2. 为什么融合是必要的&#xff1f;2.1 数据增强2.2 模型融合 3. 深入分析&#xff1a;案例研究3.1 传统机器学习方法3.2 深度学习方法3.3 融合方法 4. 未来展望结论 &#x1f389;欢迎来到AIGC人工智能专栏~AI时代…

【Java Web】HTML 标签 总结

目录 1.HTML 2.标签 1. head 标签 1.图标 2.样式居中 2. body 标签 1.注释 &#xff1a; 2.加载图片 3.加载视频 效果 4.区域 效果 5.上下跳转&#xff0c;页面跳转 效果 6.表格 效果 7.有序列表&#xff0c;无序列表 效果 8.登录 效果 9.按钮 10.多选框…

Mybatis中的#{}和${}的区别

#{}和${}他们两都是替换参数的作用&#xff0c;但也还是有很大区别的。 目录 一、${} 二、#{} 三、注意点 一、${} 它是直接替换过来&#xff0c;不添加其它的什么。 比如下面的sql语句 select *from user where id${id} 如果id1&#xff0c;那么他替换过来就还是1&#xff…

Web之tomcat

[TOC]&#xff08;文章目录&#xff09; 1.程序架构 1.C/S(client/server) 比如&#xff1a;QQ、 微信、 LOL 优点&#xff1a;有一部分代码写在客户端&#xff0c; 用户体验比较好。 缺点&#xff1a; 服务器更新&#xff0c;客户端也要随着更新。 占用资源大。 2. B/S(brows…

【Spatial-Temporal Action Localization(二)】论文阅读2017年

文章目录 1. ActionVLAD: Learning spatio-temporal aggregation for action classification [code](https://github.com/rohitgirdhar/ActionVLAD/)[](https://github.com/rohitgirdhar/ActionVLAD/)摘要和结论引言&#xff1a;针对痛点和贡献相关工作模型框架思考不足之处 2.…

C语言双向链表

文章目录 前言双向链表链表头结点的创建节点尾插与尾删节点头插与头删特定位置插入或删除节点链表节点查找双向链表的销毁 链表的打印 前言 假期时间因为为学校开学考试做准备所以一直没更新博客&#xff0c;今天开始博客会陆续更新。 双向链表 之前我们说过了顺序表和单链表…

Oracle19c安装后,使用impdp导数,报错 ORA-01017:

今天使用oracle 19c进行pdb导数的时候&#xff0c;发现如下报错ORA-01017&#xff1a; impdp mei1/"密码"mei19c directoryMEI1_EXPDP dumpfilemei1_20230913_01.dmp logfilemei1_impdp_20230913.log schemasMEI1 REMAP_TABLESPACEDATA_SERA:orcl Import: Release 1…

嵌入式这个领域会变得过于内卷吗?

今日话题&#xff0c;嵌入式这个领域会变得过于内卷吗&#xff1f;嵌入式开发主要服务于第二产业&#xff0c;尤其是制造业&#xff0c;包括电器、电气、机械、汽车、装备、航空航天等行业的“智能制造”部门&#xff0c;稳定性较强&#xff0c;不像互联网行业那样波动大。因此…

无涯教程-JavaScript - XNPV函数

描述 XNPV函数返回的现金Stream量表的净现值不一定是周期性的。要计算一系列定期现金Stream量的净现值,请使用NPV函数。 语法 XNPV (rate, values, dates)争论 Argument描述Required/OptionalRateThe discount rate to apply to the cash flows.RequiredValues 与日期付款时…