【面试】手写函数合集

strcpy

函数作用:把src的字符串放到dst的位置。

char* strcpy(char* dst, const char* src)    //该函数是没有考虑重叠的
{
    assert(dst);    //当函数返回值不是void时用assert方便一些
    assert(src);
    char* res = dst;
    while((*dst++ = *src++) != '\0');
    return res;
}
 
char* strcpy(char* dst, const char* src)
{
    assert((dst != NULL) && (src != NULL));
    char* res = dst;
    int size = strlen(src) + 1;    //因为src是指针类型,sizeof都是4,所以要用strlen
    if(dst > src && dst < src + len)
    {
        dst = dst + size - 1;
        src = src + size - 1;
        while(size--)
        {
            *dst-- = *src--;
        }
    }
    else
    {
        while(size--)
        {
            *dst++ = *src++;
        }
    }
    return res;
}

memcpy

函数作用:把src的字符串的前size个字符放到dst的位置。

void* memcpy(void* dst, const void* src, size_t size)
{
    if(dst == NULL || src == NULL)
    {
        return NULL;
    }
    void* res = dst;
    char* pdst = (char*)dst;    //memcpy的形参为void*型,要注意转换
    char* psrc = (char*)src;
 
    if(pdst > psrc && pdst < psrc + size)    //重叠
    {
        pdst = pdst + size - 1;
        psrc = pdst + size - 1;
        while(size--)
        {
            *pdst-- = *psrc--;
        }
    }
    else    //无重叠
    {
        while(size--)
        {
            *dst++ = *src++;
        }
    }
    return res;
}

strcat

函数作用:把src的字符串粘贴到dst位置字符串的后面。

char* strcat(char* dst, const char* src)
{
    char* res = dst; 
    while(*dst != '\0')    //当dst遍历到\0的时候退出,这样src正好从\0开始覆盖
        ++dst;
    while (*src != '\0')
    {
        *dst++ = *src++;
    }
    return res;
}

strcmp

函数作用:比较str1与str2是否相等,如果相等返回0,如果str1<str2返回-1,str>str2返回1(下面的函数是返回差值)。

int strcmp(const char* str1, const char* str2)
{
    while(*str1 == *str2 && *str1 != '\0')    //不等或到头了退出,计算差值
    {
        ++str1;
        ++str2;
    }
    return *str1 - *str2;    //这样返回顺便计算了是str1大还是str2大
}

猜你喜欢

转载自blog.csdn.net/u012836896/article/details/89847888