[C++] 自己编写strlen、strcpy、strcmp、strcat、memset、memcpy

本文详细介绍了如何从零开始实现C语言中的关键标准库函数,包括字符串操作(strlen、strcpy、strcmp、strcat)、内存操作(memset、memcpy),并通过实际代码展示了每个函数的内部工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自:
C/C++面试常见的几个库函数详解(strcpy,memcpy,memset,atoi…)

以下均包含如下头文件

#include<assert.h>

1.求字符串长度(不包括’\0’在内)的函数my_strlen

//
int my_strlen(const char* pStr){
    assert(pStr!=nullptr);
    int length=0;
    while(*pStr++!='\0'){
        length++;
    }
    return length;
}

2.字符串拷贝函数my_strcpy

//
char* my_strcpy(char* strDest,const char* strSrc){
    assert(strDest!=nullptr&&strSrc!=nullptr);
    char* temp=strDest;//我们需要返回dest的头指针,所以dest保留

    while(*strSrc!='\0'){
        *temp++=*strSrc++;
    }
    //strSrc末尾的'\0'也需要复制过来
    *temp='\0';

    return strDest;//返回dest头指针,支持链式表达式
}

3.字符串比较函数my_strcmp

//
// 设这两个字符串为strDest,strSrc
// 若strDest==strSrc,则返回零;
// 若strDest>strSrc,则返回正数;
// 若strDest<strSrc,则返回负数;
int my_strcmp(const char* strDest,const char* strSrc){
    assert(strDest!=nullptr&&strSrc!=nullptr);
    while(*strDest&&*strSrc&&*strDest==*strSrc){
        strDest++;
        strSrc++;
    }

    //若相等,则*strDest - *strSrc = '\0' - '\0' = 0;
    //若*strDest-*strSrc > 0,返回正数
    //若*strDest-*strSrc < 0,返回负数
    return *strDest-*strSrc;
}

4.字符串连接函数my_srccat

//
char* my_strcat(char* strDest,char* strSrc){
    assert(strDest!=nullptr&&strSrc!=nullptr);
    char* temp=strDest;
    while('\0'!=*temp)
        temp++;
    //循环结束后temp指向strDest的结尾处'\0'
    while('\0'!=strSrc)
        *temp++=*strSrc++;
    //strSrc末尾的'\0'也需要复制过来
    *temp='\0';
    return strDest;
}

5.内存初始化 my_memset

//
//将s中前n个字节用 ch 替换并返回 s
//注意:memset是以【字节】为单位进行赋值的
void* my_memset(void* s,int ch,size_t n){
    assert(s!=nullptr);
    void* temp=s;
    while(n--){
        *((char*)temp)=(char)ch;//转化为1字节
        temp=(char*)temp+1;
    }
    return s;
}

6.内存拷贝函数my_memcpy

//
//memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
void* my_memcpy(void* strDest,const void* strSrc,size_t n){
    assert(strDest!=nullptr&&strSrc!=nullptr);
    int i=0;
    void* temp=strDest;
    while(i<n){
        *((char*)temp+i)=*((char*)strSrc+i);
        i++;
    }
    return strDest;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值