实现一个memcpy函数和strcpy函数

memcpy函数

c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
函数原型:void* Memcpy(void* dest, const void* src, const rsize_t n)
因为是内存拷贝,所有接受的值也不知道是什么类型的,所以给出一个void*类型来接收。

void的含义
void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。

注意
考虑赋值内存重叠的情况。

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<assert.h>
using namespace std;


void* Memcpy(void* dest, const void* src, const rsize_t n)
{
    /*if (NULL == dest || NULL == src)
    return NULL;*/
    // 使用assert需要包含头文件
    assert(dest && src);

    // 将数据强制类型转化为字符型
    const char *pSrc = (const char*)src;
    char *pDest = (char*)dest;

    // 判断dest的位置,避免内存重叠
    if (pDest > pSrc && pDest < pSrc + n)
    {
        // 以字符形式进行拷贝
        // 从后向前拷贝
        for (size_t i = n - 1; i >= 0; --i)
        {
            pDest[i] = pSrc[i];
        }
    }
    else
    {
        // 从前向后拷贝
        for (size_t i = 0; i < n; ++i)
        {
            pDest[i] = pSrc[i];
        }
    }

    return pDest;
}

// String copy
char* Strcpy(char * dest, const char * src)
{
    if (NULL == dest || NULL == src)
        return NULL;

}

// 进行测试的主函数
int main()
{
    char * a = "abcdefg";
    char arr[7];
    Memcpy(arr, a, 5);
    for (int i = 0; i < 5; ++i)
        cout << arr[i];
    return 0;
}

strcpy函数

用于字符串的拷贝,会拷贝最后的'\0'
函数原型:char* my_strcpy(char* str1, const char* str2)

char* my_strcpy(char* str1, const char* str2)
{
    char* ret = str1;
    assert(str1 != NULL);
    assert(src != NULL);

    while ((*str1++ = *str2++) != '\0')
    {
        ;
    }
    return ret;
}

字符串操作的其他函数

猜你喜欢

转载自blog.csdn.net/qq_37934101/article/details/81538238