用自己的想法模拟实现库函数(2)完结篇

哈喽,小伙伴们,我们又见面了,上次讲完strlen函数的模拟实现后,发现还比较受大家欢迎,因此,本次给大家带来模拟函数的完结篇。温馨提示:本篇文章将会涉及到可能还未学到的实用性较高的库函数哟。当然答应大家的小福利也会放在本篇文章的末尾哦。

那么我们开始上课!


首先我们先来讲讲字母拼接的函数

stract函数作用:拼接字符串

目标:将两个数组的字符串拼接到一起。

运行原理:先找到要拼接的数组字符串的'\0',其次用赋值的符号(=)拼接上去。

上代码, 

char my_stract(char* dest, char* str)
{
    char* ret = *dest;
    assert(dest && str);//防止是空指针
    while (*dest != '\0')//找到arr1的'\0'
    {
        dest++;  
    }
    while (*dest++ = *str++)//把arr2的字符串赋值给arr1
    {
        ;
    }
    return ret;
}                                        //stract:拼接
int main()
{
    char arr1[20] = "abcdefg";
    char arr2[20] = "hijklmn";
    my_stract(arr1, arr2);
    printf("%s",arr1);
    return 0;

strcpy函数作用:拷贝(复制)

运行原理:先将'\0'前面的字符串以赋值的方式传递给另一个变量,再将'\0'传过去

char my_strcpy(char* dest, const char* str, size_t num)
{
    char* ret = *dest;
    assert(dest && str);
    while (*str != '\0')//'\0'前面的字符串,通过循环的方式赋值给另一个变量
    {
        *dest = *str;
        dest++;
        str++;
    }
    if (*str == '\0')//将'\0'传过去
    {
        *dest = *str;
    }
    return ret;
}
int main()
{
    char arr1[20] = "hellobite";
    char arr2[20] = { 0 };
    my_strcpy(arr2, arr1, 9);
    printf("%s", arr2);
    return 0;
}

strcmp函数

作用:比较字符串的大小

运行原理:根据ASCLL码值进行比较大小,大于则返回大于的数,小于则返回小于的数,等于则返回0

第一种

int my_strcmp(const char* str1,const char* str2)
{
    assert(*str1&&* str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0' && *str2 == '\0')
            return 0;
        str1++;
        str2++;
    }
    if (*str1 > *str2)  //strcmp:比较字符串的内容大小
    {
        return 1;
    }
    if (*str1 < *str2)
        return -1;
}
int main()
{
    char arr1[] = "abcdefghijklmn";
    char arr2[] = "abcdefghijklmn";
    int ret=my_strcmp(arr1, arr2);
    printf("%d", ret);
    return 0;
}

第二种:

int my_strcmp(const char* str1,const char* str2)
{
    assert(*str1&&* str2);
int my_strcmp(const char* str1, const char* str2)
{
    assert(*str1 && *str2);
    return *str1 - *str2;//让两个字符串做差(其实是字符串的ASCLL码做的差)
}
int main()
{
    char arr1[] = "abcdefghijklmn";
    char arr2[] = "abcdefghijklmn";
    int ret=my_strcmp(arr1, arr2);
    printf("%d", ret);
    return 0;
}

此外,还有三个与这仨函数比较像的

strcmp                                       strncmp

strcpy                                        strncpy

stract                                         strnact

这两组函数他们在功能上并没有多大的差别,只不过带了n的比不带n的更加安全

strtok函数作用:

strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
sterror作用: 把参数部分错误码对应的错误信息的字符串地址返回来
memcpy作用:复制
memcpy与strcpy区别:memcpy是根据字节数来确定复制的量
void my_memcpy(const void* dest,const void* str, size_t num)
{
    assert(dest && str);
    void* ret = dest;
    while (num--)
    {
        *(char*)dest = *(char*)str;//因为20是字节数,并且char类型字节数是1,符合我们的目标,所以强转为char型
        dest = (char*)dest + 1;//赋值完后字节数+1,直至num==0
        str = (char*)str + 1;
    }
    return ret;
}
int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[20] = { 0 };
    my_memcpy(arr2, arr1, 20);//20是字节
    for (int i = 0;i < 20;i++)
    {
        printf("%d ", arr2[i]);
    }
    return 0;
}
温馨提示: 如果起始位置和终点位置有任何的重叠,复制的结果都是未定义的。
那么这时候不得不提到memmove这个函数
首先,我们先讲一下它们的区别:如果起始位置和终点位置有任何的重叠,复制的结果都是未定义的。而是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
# include <stdio.h>
# include <string.h>
void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || ( char *)dst >= (( char *)src + count)) {
while (count--) {
*( char *)dst = *( char *)src;
dst = ( char *)dst + 1 ;
src = ( char *)src + 1 ;
}
}
else {
dst = ( char *)dst + count - 1 ;
src = ( char *)src + count - 1 ;
while (count--) {
*( char *)dst = *( char *)src;
dst = ( char *)dst - 1 ;
src = ( char *)src - 1 ;
}
}
return (ret);
}
int main ()
{
int arr1[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
memmove(arr1+ 2 , arr1, 20 );
int i = 0 ;
for (i = 0 ; i < 10 ; i++)
{
printf ( "%d " , arr2[i]);
}
memset函数作用:将内存中的值以字节为单位设置成想要的内容
# include <stdio.h>
# include <string.h>
int main ()
{
char str[] = "hello world" ;
memset (str, 'x' , 6 );
printf (str);
return 0 ;
}
最后输出的结果应该是xxxxxxworld

今天的内容到这里就要结束了,那么我先前说过的奖励当然给到大家

"stract" - C++ Search results (cplusplus.com)
这个网址可以查询到各种库函数的头文件以及作用
那么我们下期再见

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

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

相关文章

Leetcode刷题笔记——动态规划之子序列问题篇

Leetcode刷题笔记——动态规划之子序列问题篇 一、回文 第一题&#xff1a;回文子串 Leetcode647. 回文子串&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着…

案例实践 | 基于长安链的煤质检测智慧实验室

案例名称-煤质检测智慧实验室 ■ 建设单位 国能数智科技开发&#xff08;北京&#xff09;有限公司 ■ 用户群体 煤炭生产单位、电力单位、化工单位等产业链上下游单位 ■ 应用成效 化验效率提升50%&#xff0c;出验时间缩短40%&#xff0c;提高化验数据市场公信力 案例…

数据降维 | Matlab实现POD本征正交分解数据降维模型

数据降维 | Matlab实现POD本征正交分解数据降维模型 目录 数据降维 | Matlab实现POD本征正交分解数据降维模型基本介绍模型描述程序设计基本介绍 1.Matlab实现POD本征正交分解数据降维模型(完整源码和数据); 2.运行环境matlab2023; 3.POD降维,POD分解(Proper Orthogonal D…

Lua热更新(Lua)

-- [[]] print 下载Lua For Windows Sublime Text&#xff08;仅用于演示&#xff0c;实际项目使用VsCode&#xff09; CtrlB运行 语法基础 基础类型&#xff1a;nil number string boolean 运算符&#xff1a;and-or-not ~ ^ if-then-end-elseif-else while-do-…

只有IP地址怎么实现HTTPS访问?

只有IP地址也可以实现HTTPS访问。虽然大部分SSL证书通常是针对域名发放&#xff0c;但也存在专门针对IP地址发放的SSL证书&#xff0c;这类证书允许服务器通过HTTPS协议为其公网IP地址提供安全的Web服务。当服务器配置了基于IP地址的SSL证书后&#xff0c;用户可以通过“https:…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-字串数字

3725573269 #include<iostream> #include<map> #include<string> using namespace std; int main(){map<char, int> mp;string s "LANQIAO";long long ans 0, power 1;//7位数的26进制可能会超过int范围for(int i 1; i < 26; i){mp.…

深度学习(过拟合 欠拟合)

过拟合&#xff1a; 深度学习模型由于其复杂性&#xff0c;往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法&#xff1a; 1. 数据量不足&#xff1a;深度学习模型通常需要大量的数据来进行训练&#xff0c;如果数据量不足&#xff0c;模型容易过度…

vue3怎么使用reactive赋值

使用ref赋值&#xff1a; const list ref([]) const getList async () > {const res await axios.get(/list)list.value res.data } 如何使用reactive来替换呢&#xff1f; //const list ref([]) const list reactive([]) const getList async () > {const res…

NLP 笔记:LDA(训练篇)

1 前言&#xff1a;吉布斯采样 吉布斯采样的基本思想是&#xff0c;通过迭代的方式&#xff0c;逐个维度地更新所有变量的状态 1.1 举例 收拾东西 假设我们现在有一个很乱的屋子&#xff0c;我们不知道东西应该放在哪里&#xff08;绝对位置&#xff09;&#xff0c;但知道哪…

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱&#xff0c;问题也不少。&#x1f602; 那就有病治…

鸿蒙Harmony应用开发—ArkTS-ForEach:循环渲染

ForEach基于数组类型数据执行循环渲染。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 接口描述 ForEach(arr: Array,itemGenerator: (item: Array, index?: number) > void,keyGenerator?: (item: Array, index?: number): string …

【wails】(10):研究go-llama.cpp项目,但是发现不支持最新的qwen大模型,可以运行llama-2-7b-chat

1&#xff0c;视频演示地址 2&#xff0c;项目地址go-llama.cpp 下载并进行编译&#xff1a; git clone --recurse-submodules https://github.com/go-skynet/go-llama.cpp cd go-llama.cpp make libbinding.a项目中还打了个补丁&#xff1a; 给 编译成功&#xff0c;虽然有…

深度学习 线性神经网络(线性回归 从零开始实现)

介绍&#xff1a; 在线性神经网络中&#xff0c;线性回归是一种常见的任务&#xff0c;用于预测一个连续的数值输出。其目标是根据输入特征来拟合一个线性函数&#xff0c;使得预测值与真实值之间的误差最小化。 线性回归的数学表达式为&#xff1a; y w1x1 w2x2 ... wnxn …

【隐私计算实训营——004上手隐语SecretFlow和SecretNote安装部署】

1. SecretFlow安装 1.1 环境要求 Python>3.8操作系统 Ubuntu18 资源&#xff1a;>8核16GB安装包 secretflow-lite 安装方式 docker&#xff08;推荐&#xff09; 2. SecretFlow部署模式 SecretFlow使用Ray作为分布式计算调度框架。 Ray集群由一个主节点和零或若干个…

Fabric Measurement

Fabric Measurement 布料测量

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 &#xff1a; 配置隔离 默认&#xff1a; public &#xff08;默认命名空间&#xff09;:默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产&#xff1a;有不同的配置文件 比如…

docker 数据卷 (二)

1&#xff0c;为什么使用数据卷 卷是在一个或多个容器内被选定的目录&#xff0c;为docker提供持久化数据或共享数据&#xff0c;是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效&#xff0c;当提交或创建镜像时&#xff0c;卷不被包括在镜像中。 总结为两…

Orbit 使用指南 10|在机器人上安装传感器 | Isaac Sim | Omniverse

如是我闻&#xff1a; 资产类&#xff08;asset classes&#xff09;允许我们创建和模拟机器人&#xff0c;而传感器 (sensors) 则帮助我们获取关于环境的信息&#xff0c;获取不同的本体感知和外界感知信息。例如&#xff0c;摄像头传感器可用于获取环境的视觉信息&#xff0c…

ADB环境配置和基础使用

目录 一、ADB简介工作原理 二、安装ADB驱动程序配置环境变量验证ADB安装 三、启用USB调试模式四、连接设备到计算机五、使用ADB命令安装/卸载包Android 设备与电脑传输文件exit 退出目录日志操作指令系统操作指令adb ps命令 一、ADB简介 ADB全称是Android Debug Bridge&#x…

CentOS系统部署YesPlayMusic播放器并实现公网访问本地音乐资源

文章目录 1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 本篇文章讲解如何使用Docker搭建YesPlayMusic网易云音乐播放器&#xff0c;并且结合cpolar内网穿透实现公网访问音乐播放器。 YesPlayMusic是一款优秀的个人音乐播放器&am…