遥遥领先的内存函数

目录

​编辑

函数介绍

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,一经查实,立即删除!

相关文章

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;快速搭建一套属于自己的自动驾驶系统。 百度开放此项计划旨在建立一个以合作为中…

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.多选框…

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;今天开始博客会陆续更新。 双向链表 之前我们说过了顺序表和单链表…

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

今日话题&#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 与日期付款时…

【javaSE】 反射与反射的使用

文章目录 &#x1f332;反射的定义&#x1f38d;反射的用途&#x1f334;反射基本信息&#x1f340;反射相关的类&#x1f6a9;Class类(反射机制的起源 )&#x1f388;Class类中的相关方法 &#x1f6a9;反射示例&#x1f388;获得Class对象的三种方式&#x1f388;反射的使用 …

Linux CentOS7修改命令行提示符

在CentOS操作系统中&#xff0c;命令和文件是我们与计算机进行交互的重要方式之一。有时候我们可能需要对某些命令、变量或文件进行修改&#xff0c;以满足特定的需求或提高工作效率。 本人在文章《Linux CentOS7命令及命令行》中对命令行提示符的修改作了初步介绍&#xff0c…

el-table纵向垂直表头

参考&#xff1a;https://www.jianshu.com/p/1f38eaffd070 <el-tablestyle"width: 100%":data"getValues":show-header"false"border:cell-style"cellStyle" ><el-table-columnv-for"(item, index) in getHeaders"…

MySQL数据同步归档使用工具总结

数据迁移方式&工具总结 kettel的使用dataX的使用pt-archiver的使用 kettel的使用 1、中文网&#xff1a;http://www.kettle.org.cn/ 2、下载地址 3、使用kettle进行数据迁移 3.1 打开文件夹&#xff0c;运行spoon.bat 3.2 点击文件&#xff0c;新建转换 3.3 新建数据库…

ctfshow-web-红包题 葵花宝典

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库溯源相关 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 题目 0x02 Write Up 这道题说实话比较奇怪&#xff0c;有一个注册接口&#xff0c;先注册一个账号在&#xff0c;我注册的是admins 123456 然后登…

跨进程通讯之Binder通讯

一、oneway、in、out、inout关键字讲解 1、oneway&#xff1a;异步执行&#xff0c;不管服务器有没有执行完&#xff0c;直接返回 2、in&#xff1a;数据只能由客户端流入服务端 3、out&#xff1a;数据只能由服务端流出到客户端 4、inout&#xff1a;数据可以在服务端与客…