c语言(字符串函数和内存函数的模拟实现)

1、模拟strlen(临时变量法)

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str);
int main() {char str[] = "abcdefh";int ret = my_strlen(str);printf("%d", ret);return 0;
}
int my_strlen( const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}

2、模拟strlen(指针减指针)

#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str);
int main()
{char str[] = "abcdfef";int ret = my_strlen(str);printf("%d", ret);return 0;
}
int my_strlen(const char* str)
{assert(str != NULL);char* p = str;while (*p != '\0'){p++;}return p - str;}

3、模拟strlen(函数递归)

#include <stdio.h>
#include <assert.h>
int main()
{char str[] = "abcdef";int ret = my_strlen(str);printf("%d", ret);return 0;
}
int my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}

4、模拟实现strcpy

#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src);
int main()
{char str1[30] = "abcdef";char* p = "hig";char* a = my_strcpy(str1, p);printf("%s\n", str1);printf("%s", a);return 0;
}
char* my_strcpy(char* dest, const char* src)
{assert(dest != NULL);assert(src != NULL);char* p = dest;while (*src){*dest = *src; dest++;src++;}*dest = *src;return p;      //虽然内存中的内容变了,但是地址还是那个地址,没有变。
}

5、模拟实现strcat

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, char* src);
int main()
{char str1[20] = "majun ";char str2[] = "jindachang";char* p = my_strcat(str1, str2);printf("%s", p);return 0;
}
char* my_strcat(char* dest, const char* src)
{assert(dest);assert(src);char* p = dest;while (*dest != '\0'){dest++;}//dest++;   //必须把\0改掉,不然打印的时候只打印前半部分while (*dest++ = *src++){;}return p;
}

6、模拟实现strcmp

#include <stdio.h>
#include <assert.h>
int compare(char* str1, char* str2);
int main()
{char str1[] = "abcdeg";char str2[] = "abcdeg";int ret = compare(str1, str2);if (ret > 0){printf("str1>str2\n");}else if (ret == 0){printf("str1=str2\n");}else{printf("str1<str2");}return 0;
}
int compare(char* str1, char* str2)
{while (*str1 == *str2){if (*str1 == '\0' ) //这条判断要在++之前{return 0;}str1++;str2++;}return (*str1 - *str2);
}

7、模拟实现strncpy

#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* dest, const char* src, int num);
int main()
{char str[20] = "sjah";char* p = "m";my_strncpy(str, p, 2);printf("%s", str);return 0;
}
char* my_strncpy(char* dest, const char* src, int num)
{assert(dest);assert(src);char* p = dest;for (int i = 0; i < num; i++){if (src != '\0')         //scr没有遇到\0{*dest++ = *src++;}else{break;}}return p;
}

8、模拟实现strncat

#include <stdio.h>
#include <assert.h>
char my_strncat(char* dest, const char* src, int num);
int main()
{char str[20] = "majun ";char* p = "jin da chang";my_strncat(str, p, 3);printf("%s", str);return 0;
}
char my_strncat(char* dest,const char* src, int num)
{while (*dest != '\0'){dest++;}for (int i = 0; i < num; i++){if (src != '\0')         //scr没有遇到\0{*dest++ = *src++;}else{break;}}
}

9、模拟实现strncmp

#include <stdio.h>
#include <assert.h>
int my_strncmp(char* str1, char* str2, int num);
int main()
{char str1[] = "abcdef";char str2[] = "abfse";int ret = my_strncmp(str1, str2, 3);if (ret > 0){printf("str1>str2\n");}else if (ret == 0){printf("str1=str2\n");}else{printf("str1<str2");}return 0;
}
int my_strncmp(char* str1, char* str2, int num)
{int count = 1;while (*str1 == *str2){if (count == num){return 0;}if (*str2 == '\0'){return 0;}str1++;str2++;count++;}return *str1 - *str2;
}

10、strstr的使⽤和模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2);
int main()
{char str1[] = "abbbcdef";char str2[] = "sda";char* ret = my_strstr(str1, str2);printf("%s", ret);return 0;
}
char* my_strstr(const char* str1, const char* str2)
{assert(str1);assert(str2);const char* s1;const char* s2;while (*str1) {s1 = str1;s2 = str2;while (*s1!='\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return str1;}str1++;}return NULL;}

11、memcpy使⽤和模拟实现

#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, void* src, int num);
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9 };int arr2[] = { 6,7,8,9 };my_memcpy(arr1, arr2, 8);for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++){printf("%d", arr1[i]);}return 0;
}
void* my_memcpy(void* dest, void* src, int num)
{assert(dest);assert(src);void* p = dest;while (num){*(char*)dest = *(char*)src;(char*)dest = (char*)dest + 1;(char*)src = (char*)src + 1;num--;}return p;
}

12、memmove使⽤和模拟实现

#include <stdio.h>
void* my_memmove(const void* dest, const void* src, int num);
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(&arr[2], &arr[3], 2);for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}
void* my_memmove(const void* dest, const void* src, int num)
{void* p = dest;if (dest <= src || dest > ((char*)src + num)){while (num){*(char*)dest = *(char*)src;(char*)dest = (char*)dest + 1;(char*)src = (char*)src + 1;num--;}}else{(char*)dest = (char*)dest + num - 1;(char*)src = (char*)src + num - 1;while (num){*(char*)dest = *(char*)src;(char*)dest = (char*)dest - 1;(char*)src = (char*)src - 1;num--;}}return p;
}

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

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

相关文章

代码随想录算法训练营第四十七天|198.打家劫舍, 213.打家劫舍II , 337.打家劫舍III

198.打家劫舍 https://leetcode.com/problems/house-robber/description/ 思路&#xff1a; 经典的动态规划问题&#xff0c;首先确定dp 数组记录的是打劫到第i家时的收获&#xff0c; dp[0] 0&#xff0c; dp[1] values[0]. 然后到第i 家有两个选择&#xff0c; 一个是打劫…

koa2+vue3通过exceljs实现数据导出excel文档

服务端安装exceljs依赖 npm i exceljs服务端实现代码 实现导出excel文件工具方法 const ExcelJS require(exceljs); /*** description: 导出excel文件* param {*} fileHeader 导出的表头* param {*} data 导出的数据* param {*} ctx 上下文对象* return {*}*/ async funct…

计算机三级网络技术综合题第三题、第四题详细解析

第三大题 DHCP报文分析&#xff08;10分&#xff09; 一、DHCP工作流程&#xff08;一般情况下&#xff09; 报文摘要 对应上面报文1—4 报文1、3DHCP&#xff1a;Request&#xff1b; 报文2、4DHCP&#xff1a;Reply。 例题&#xff08;第三套&#xff09;&#xff1a;在一…

Flutter 当涉及Listview的复杂滑动布局良好布局方式

目录 引 代码以及概叙 详细解释 SingleChildScrollView shrinkWrap 属性 NeverScrollableScrollPhysics 引 当我们构建界面&#xff0c;很多时候都会需要显示一个能滑动的流布局&#xff0c;同时这个布局还要有些其他的界面元素&#xff0c;同时在flutter中&#xff0c;滑…

大型项目中的敏捷开发实践:原则、方法与工具的应用经验分享

引言 在软件开发领域&#xff0c;大型项目往往伴随着高风险和复杂性&#xff0c;传统的瀑布模型往往难以应对快速变化的需求和不确定的环境。而敏捷开发方法以其灵活、快速响应变化的特点&#xff0c;逐渐成为大型项目管理的有力武器。本文旨在分享我在大型项目中应用敏捷开发…

程序员入行忠告!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部…

十大经典排序之归并排序

文章目录 概要整体架构流程代码实现小结 概要 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。 作为一种典型的分而治之思想的算法应用&#xff0…

十五、自回归(AutoRegressive)和自编码(AutoEncoding)语言模型

参考自回归语言模型&#xff08;AR&#xff09;和自编码语言模型&#xff08;AE&#xff09; 1 自回归语言模型&#xff08; AR&#xff09; 自回归语言模型&#xff08;AR&#xff09;就是根据上文内容&#xff08;或下文内容&#xff09;预测下一个&#xff08;或前一个&…

安装OpenEBS,镜像总是报错ImagePullBackOff或者ErrImagePull的解决方法

按照 KubeSphere 官方文档安装 OpenEBS&#xff0c;镜像总是报错ImagePullBackOff或者ErrImagePull的解决方法 helm 有很多更换 源 的文章&#xff0c;有一些是写更换阿里云的源&#xff0c;但是阿里云的源根本没更新OpenEBS的镜像。 在网上找到1个可用的源&#xff1a; 可用的…

VSCODE的常用插件

1、中文设置 &#xff08;1&#xff09;搜索 chinese Chinese (Simplified) Language Pack for Visual Studio Code C/C Extension Pack &#xff08;2&#xff09;配置 通过使用“Configure Display Language”命令显式设置 VS Code 显示语言&#xff0c;可以替代默认 UI…

计算最长的字符串长度

本题要求实现一个函数&#xff0c;用于计算有n个元素的指针数组s中最长的字符串的长度。 函数接口定义&#xff1a; int max_len( char *s[], int n ); 其中n个字符串存储在s[]中&#xff0c;函数max_len应返回其中最长字符串的长度。 裁判测试程序样例&#xff1a; #inclu…

Django性能优化

1.服务器CPU太高的优化 1>在Django项目中使用line_profiler进行性能剖析&#xff0c;您需要遵循以下步骤来设置并使用它&#xff1a; 注&#xff1a;此种方式似乎中间件无法启动&#xff01;&#xff01;&#xff01; 要使用Django与line_profiler进行特定视图的性能测试…

探讨TCP的可靠性以及三次握手的奥秘

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. TCP的可靠性机制1.2可靠性的基础上,尽可能得提高效率 2. TCP三次握手过程3. 为何不是四次握手&#xff1f; 在互联网的复杂世界中&#xff0c;TCP&am…

基于springboot的高校教师教研信息填报系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

SpringBoot3整合Redis基础操作

SpringBoot3整合Redis&基础应用 配套视频&#xff1a;SpringBoot3整合Redis&基础操作视频 1. 概述 SpringBoot是一种用于构建Java应用程序的开发框架&#xff0c;Redis是一个高性能的键值存储数据库&#xff0c;常用于缓存、会话管理、消息队列等应用场景&#xff0…

亚马逊云科技Glue

Glue 最重要的部分&#xff0c; ETL&#xff1a;用于从 A 点&#xff08;我们的源数据&#xff09;提取、转换和加载数据到 B 点&#xff08;目标文件或数据存储库&#xff09;。 AWS Glue 会为您执行大量此类工作。 转换通常是更繁重的工作&#xff0c;需要从各种来源进行组合…

【嵌入式DIY实例】-自动割草机器

自动割草机器 文章目录 自动割草机器1、割草机器介绍2、硬件准备3、功能设计4、硬件接线5、代码实现本文将介绍如何使用 Arduino 构建一个简易自动割草机机器人或割草机机器人。该机器人可以自动剪掉花园里多余的草。如果花园里有障碍物,它会自动改变方向。帮助以减少人力。 警…

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考&#xff1a;ES的安装使用(windows版) elasticsearch的下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…

半小时搭建keycloak环境,构建强大的用户中心

第一步: 安装JDK 第二步: 安装Docker 第三步: 部署 keycloak 写一个dockerfile # docker file FROM quay.io/keycloak/keycloak:19.0.3 as builder# Enable health and metrics support ENV KC_HEALTH_ENABLED=true # 设置健康检查启用标志为true ENV KC_METRICS_EN…

Docker 解析:使用 Dockerfile 自动构建镜像

简介 Docker 容器是使用 基础 镜像创建的。一个镜像可以是基本的&#xff0c;只包含操作系统的基本要素&#xff0c;也可以包含一个准备好启动的复杂的预构建应用程序堆栈。 在使用 Docker 构建镜像时&#xff0c;每个操作&#xff08;例如执行的命令&#xff0c;比如 apt-get…