手写函数原型

1、memcpy函数

void *memcpy(void *dst, const void *src, int len)
{
   if(NULL == dst || NULL == src)
  {   
return NULL;  } void *ret = dst; if(dst <= src || (char *)dst >= (char *)src + len)
{
//没有内存重叠,从低地址开始复制 while(len--)
  {   
*(char *)dst = *(char *)src;   dst = (char *)dst + 1;   src = (char *)src + 1; } }
else
{ //有内存重叠,从高地址开始复制 src = (char *)src + len - 1; dst = (char *)dst + len - 1; while(len--)
{
*(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return ret; }

2、memmove函数

链接:https://www.nowcoder.com/questionTerminal/9602083ec8d749999d86adf8a725b4f7
来源:牛客网

在linux中,memcpy是不考虑内存重叠的隐患问题的,即方法一;  memcpy的改进版,考虑上内存重叠问题,就是memmove,即方法二。
方法一:
void *memcpy(void *dest, const void *src, size_t n)
{
    char *tmp = (char *)dest;
    char *s = (char *)src;
 
    while (n--)
        *tmp++ = *s++;
    return dest;
}
 
方法二:
void *memmove(void *dest, const void *src, size_t n)
{
    char *tmp, *s;
 
    if (dest <= src)                     //没有内存重叠,从低地址开始复制
    {
        tmp = (char *) dest;
        s = (char *) src;
        while (n--)
            *tmp++ = *s++;
    }
    else                                 //有内存重叠,从高地址开始复制
    {
        tmp = (char *) dest + n;
        s = (char *) src + n;
        while (n--)
            *--tmp = *--s;
    }
    return dest;
}

3、strcpy函数

char *strcpy(char *strDest, const char *strSrc)
{   assert((strDest
!=NULL) && (strSrc!=NULL));//首先判断两个指针指向的地址不为空 char *address = strDest;//然后声明一个指针,将目的指针的地址赋值给它 //将原指针的值挨个赋值给目的指针,直到遇到'\0'   while((*strDset++ = *strSrc++) != '\0'); return address;//返回复制的指针 }

4、strcat函数

char * strcat (char * dst, const char * src)
{
    char * tmpdst = dst;
    while( *tmpdst )
        tmpdest++;                                /* find end of dst */
    while( *tmpdst++ = *src++ ) ;     /* Copy src to end of dst */
        return( dst );                         /* return dst */
}

//那么为什么要返回char*类型呢?
答:是为了方便赋值给其他变量
//再问,还有其他办法能实现s1连接s2字符串吗?
答:可以,如下:
void Mystrcat (char dst[ ],char src[]) 
{ 
    int i=0,j=0;                  //数组下标初始化为0 
   
    while (dst[i] !='\0’) 
        i++; 
    while (src[j] !=’\0’) 
    { 
        dst[i]=src[j];
            i++; 
            j++; 
    } 
    dst[i]=’\0’; //在字符串dst的末尾添加一个字符串结束标志
}         

5、atoi函数

int myatoi(char *str)
{
    int ret = 0, cur;
    int flag = 1;
    assert(str != NULL);
    while (*str == ' ') 
{ str
++; } if (*str == '-' || *str == '+')
{
if (*str == '-')
     { flag
= -1; } str++; } while (*str >= '0' && *str <= '9')
{ cur
= *str - '0'; if (flag == 1)
{
if (ret > INT_MAX / 10 || (ret == INT_MAX / 10 && cur >= INT_MAX % 10)) return INT_MAX; } else
{
if (-ret < INT_MIN / 10 || (-ret == INT_MIN / 10 && -cur <= INT_MIN % 10)) return INT_MIN; } ret = ret * 10 + cur; str++; } return ret * flag; } ———————————————— #define INT_MAX 2147483647 #define INT_MIN (-INT_MAX - 1) 二者位于<limit.h>之中

 

posted @ 2020-07-04 11:46  道微真理  阅读(229)  评论(0编辑  收藏  举报