标准库函数实现

原创 2013年12月04日 11:40:08

1、memcpy

面试中如问到memcpy的实现,那就要小心了,这里有陷阱。

先看下标准memcpy()的解释:

void *memcpy(void *dst, const void *src, size_t n);
//If copying takes place between objects that overlap, the behavior is undefined.

注意下面的注释,对于地址重叠的情况,该函数的行为是未定义的。

事实上所说的陷阱也在于此,自己动手实现memcpy()时就需要考虑地址重叠的情况。

另外,标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?

因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。

void* memcpy(void *dst, const void *src, size_t count)      
{      
    //安全检查  
    assert( (dst != NULL) && (src != NULL) );      
  
    char *pdst = (char *)dst;      
    const char *psrc = (const char *)src;      
  
    //防止内存重复  
    assert(!(psrc<=pdst && pdst<psrc+count));      
    assert(!(pdst<=psrc && psrc<pdst+count));      
  
    while(count--)      
    {      
        *pdst++ = *psrc++;          
    }      
    return dst;      
}    

2、strcpy

标准库声明:char *strcpy(char *dest, const char *src);

char * strcpy( char *dest, const char *src )      
{     
    assert( (dest != NULL) && (src != NULL) ); 
    if(dest == src)
        return dest; 
        
    char *ptr = dest;  
    while( (*dest++ = * src++) != '\0' )          
        ;      
    return ptr;     
}  

3、strncpy

标准库声明:char *strncpy(char *dest, const char *src, size_t n);

char *strncpy(char *dest, const char *src, size_t count)      
{      
    assert(dest != NULL && src != NULL);      
    char *ptr = dest;      
    while (count-- && *src != '\0')      
        *dest++ = *src++;   
    *dest = '\0';  
    return ptr;      
} 

4、strstr

标准库声明:char *strstr(const char *haystack, const char *needle);

char *strStr(char *haystack, char *needle)
{
    // IMPORTANT: Please reset any member data you declared, as
    // the same Solution instance will be reused for each test case.
    if(needle == NULL || haystack == NULL)
        return NULL;
    int i,j;
    for (i = j = 0; haystack[i] && needle[j];)
    {
        if (haystack[i] == needle[j])
        {
            ++i;
            ++j;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    return needle[j]?NULL:(haystack + i - j);

}

5、memmove

标准库声明:void *memmove(void *dest, const void *src, size_t n);

void* memmove(void* dst,const void* src,size_t n) 
{     
    assert(dst != NULL && src != NULL);
    char* p = (char*)dst; 
    char* q = (char*)src; 
    
    if (p <= q || p >= q + n)// 
    { 
        while (n--) 
        { 
            *p++ = *q++; //按递增拷贝
        } 
    } 
    else  //
    { 
        p += n -1;//overlap的情况,从高位地址向低位拷贝 
        q += n -1; 
        while (n--) 
        { 
            *p-- = *q--; //按递减拷贝
        } 
    } 
    return dst; 
}

6、strcmp

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

7、strlen

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

8、strcat

char *strcat(char *dst, const char *src)
{
    assert((dst != NULL) && (src != NULL));

    char *pdst = dst;
    while (*dst != '\0')
        ++dst;
    while ((*dst++ = *src++) != '\0')
        ;
    return pdst;
}










自己实现基本的C标准库函数——实现memcpy

不调用库函数,实现memcpy。 转自:http://hi.baidu.com/sernger/blog/item/fa900ecb43d44f4ff21fe7ea.html首先对这个函数做一些说明。...
  • gengshenghong
  • gengshenghong
  • 2010年05月30日 16:51
  • 3226

算法提高 ADV-222 7-2求arccos值

问题描述   利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1],返回值为[0, PI]。要求结果准确到小数点后5位。(PI = 3.14159...
  • smile_caijx
  • smile_caijx
  • 2017年09月20日 23:29
  • 113

8.0 标准库printf函数实现

实例6---程序调试助手printf-----程序目的:如何利用标准库实现printf函数 printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指...
  • mlidsdf
  • mlidsdf
  • 2014年07月05日 11:16
  • 705

C常见标准库函数实现

C语言中的一些标准库函数虽然简单,但笔试面试中确常常考察. void *memchr(const void *s, int c, size_t n);/*** *Description: *...
  • u014294070
  • u014294070
  • 2014年09月24日 19:57
  • 126

C标准库常用函数实现

下面介绍一些常用的标准库库函数,因为经常用到,所以搞懂内部源代码很重要,也是进一步学习C语言指针很有用。慢慢更新,很重要的过程。 为了防止和库函数名重复,例如strncpy则表示为mystrncpy测...
  • u010710458
  • u010710458
  • 2017年09月09日 11:05
  • 158

C标准库函数实现之字符串操作

在C/C++开发工作中会经常遇到操作字符串的情形,只有在了解了其实现方式,运用时才能随心所欲,有的放矢。 小编结合工作中操作字符串的经验,整理了一些常用的字符串操作函数予以分享。 持续更新中......
  • douyacai123123
  • douyacai123123
  • 2015年01月23日 15:02
  • 145

算法提高 7-2求arccos值

算法提高 7-2求arccos值 时间限制:10.0s 内存限制:256.0MB 提交此题 问题描述   利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范...
  • qq_32792879
  • qq_32792879
  • 2017年03月07日 15:59
  • 543

strcpy() 函数 标准实现

http://hi.baidu.com/rxpeng/item/c2490f161b8b1bc738cb30e8 C语言标准库函数       原型声明:extern char *...
  • littlestream9527
  • littlestream9527
  • 2012年12月04日 21:19
  • 1558

【蓝桥杯】算法提高 7-2求arccos值

利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1],返回值为[0, PI]。要求结果准确到小数点后5位。(PI = 3.1415926)   提示:要...
  • eagle_or_snail
  • eagle_or_snail
  • 2017年02月21日 22:13
  • 807

C语言标准库函数 qsort详解

第一篇 qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定)。集成在C语言库函数里面的的qsort函数...
  • smallgyy
  • smallgyy
  • 2014年03月21日 14:01
  • 1569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:标准库函数实现
举报原因:
原因补充:

(最多只允许输入30个字)