面试必会函数源代码 strcpy/memcpy/atoi/kmp/quicksort

2014-11-23 18:01:59 · 作者: · 浏览: 13


一、写在前面

继上一次发表了一片关于参加秋招的学弟学妹们如何准备找工作的博客之后,反响很大,顾在此整理一下,以便大家复习。好多源自july的这篇博客,也有很多是我自己整理的。希望大家能够一遍一遍的写,直到能够秒杀为止。


二、stl模板函数


1、strcpy

char * strcpy( char *strDest, const char *strSrc )        
{       
    if(strDest == strSrc) { return strDest; }    
    assert( (strDest != NULL) && (strSrc != NULL) );       
    char *address = strDest;        
    while( (*strDest++ = * strSrc++) != '\0' );        
    return address;       
}  

2、strncpy

char *strncpy(char *strDes, const char *strSrc, unsigned int count)        
{        
    assert(strDes != NULL && strSrc != NULL);        
    char *address = strDes;        
    while (count-- && *strSrc != '\0')        
        *strDes++ = *strSrc++;     
    *strDes = '\0';    
    return address;        
} 


3、strcmp

int strcmp(const char *s, const char *t)     
{     
    assert(s != NULL && t != NULL);     
    while (*s && *t && *s == *t)     
    {     
        ++ s;     
        ++ t;     
    }     
    return (*s - *t);     
} 

4、strcat

char *strcat(char *strDes, const char *strSrc)     
{     
    assert((strDes != NULL) && (strSrc != NULL));     
    char *address = strDes;     
    while (*strDes != '\0')     
        ++ strDes;     
    while ((*strDes ++ = *strSrc ++) != '\0')     
        NULL;     
    return address;     
} 

5、strlen

int strlen(const char *str)     
{     
    assert(str != NULL);     
    int len = 0;     
    while (*str ++ != '\0')     
        ++ len;     
    return len;     
}  

6、strstr

char *strstr(const char *strSrc, const char *str)     
{     
    assert(strSrc != NULL && str != NULL);     
    const char *s = strSrc;     
    const char *t = str;     
    for (; *strSrc != '\0'; ++ strSrc)     
    {     
        for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)     
            NULL;     
        if (*t == '\0')     
            return (char *) strSrc;     
    }     
    return NULL;     
}   

7、strncat

char *strncat(char *strDes, const char *strSrc, unsigned int count)     
{     
    assert((strDes != NULL) && (strSrc != NULL));     
    char *address = strDes;     
    while (*strDes != '\0')     
        ++ strDes;     
    while (count -- && *strSrc != '\0' )     
        *strDes ++ = *strSrc ++;     
    *strDes = '\0';     
    return address;     
}

8、strncmp

int strncmp(const char *s, const char *t, unsigned int count)     
{     
    assert((s != NULL) && (t != NULL));     
    while (*s && *t && *s == *t && count --)     
    {     
        ++ s;     
        ++ t;     
    }     
    return (*s - *t);     
}

9、memcpy

void *memcpy(void *dest, const void *src, unsigned int count)     
{     
    assert((dest != NULL) && (src != NULL));     
    void *address = dest;     
    while (count --)     
    {     
        *(char *) dest = *(char *) src;     
        dest = (char *) dest + 1;     
        src = (char *) src + 1;     
    }     
    return address;     
} 

10、memccpy

void *memccpy(void *dest, const void *src, int c, unsigned int count)     
{     
    assert((dest != NULL) && (src != NULL));     
    while (count --)     
    {     
        *(char *) dest = *(char *) src;     
        if (* (char *) src == (char) c)     
            return ((char *)dest + 1);     
        dest = (char *) dest + 1;     
        src = (char *) src + 1;     
    }     
    return NULL;     
} 

11、memcmp

int memcmp(const void *s, const void *t, unsigned int count)     
{     
    assert((s != NULL) && (t != NULL));     
    while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)     
    {     
        s = (char *) s + 1;     
        t = (char *) t + 1;     
    }     
    return (*(char *) s - *(char *) t);     
}

12、memmove

//@big:    
//要处理src和dest有重叠的情况,不是从尾巴开始移动就没问题了。    
//一种情况是dest小于src有重叠,这个时候要从头开始移动,    
//另一种是dest大于src有重叠,这个时候要从尾开始移动。    
void *memmove(void *dest, const void *src, unsigned int count)     
{    
    assert(dest != NULL && src != NULL);    
    char* pdest = (char*) dest;    
    char* psrc = (char*) src;    
  
    //pdest在psrc后面,且两者距离小于count时,从尾部开始移动. 其他情况从头部开始移动    
    if (pdest > psrc && pdest - psrc < count)     
    {    
        while (count--)     
        {    
            *(pdest + count) = *(psrc + count);    
        }    
    } else     
    {    
        while (count--)     
        {    
            *pdest++ = *psrc++;    
        }    
    }    
    return dest;    
}  

13、memset

void *memset(void *str, int c, unsigned int count)     
{     
    assert(str != NULL);     
    void *s = str;     
    while (count --)     
    {     
        *(char *) s = (char) c;     
        s = (char *) s + 1;     
    }     
    return str;     
}


三、atoi && itoa


1、atoi


2、itoa



四、kmp && quicksort


1、kmp


2、quicksort