常用库函数编程实现用法总结(一)memmove memcpy strcpy strncpy

来源:互联网 发布:淘宝麻辣小黑粉店铺 编辑:程序博客网 时间:2024/06/08 15:24

/********************************************************************************
memmove() copies a source memory buffer to a destination memory buffer.This
routine recognize overlapping buffers to avoid propogation.For cases where
propagation is not a problem, memcpy() can be used.
memmove()由src所指定的内存区域赋值count个字符到dst所指定的内存区域。
src和dst所指内存区域可以重叠,但复制后src的内容会被更改。
函数返回指向dst的指针。
原型:void *memmove( void* dest, const void* src, size_tcount );
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域可以重叠,但复制后dest内容会被更改。
函数返回指向dest的指针。 相关函数:memset、memcpy
memcpy不考虑内存重叠,而memmove会考虑,memcpy只是memmove的一个子集,
所以建议总是用memmove这样可以不考虑内存重叠问题。
******************************************************************/
/*因为参数类型为void指针,所以可以复制任意类型的数据*/
void * my_memmove(void * dst,const void * src,int count)
{
    void * ret = dst;
    assert( (dst!=NULL)&&(src!=NULL) );
    /*可以增加输入参数的安全检查,为了提高效率也可以不进行安全检查*/
    /*没有地址重叠冲突*/
    if (dst <= src || (char *)dst >= ((char *)src + count))
    {
        while (count--)
        {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    /*有地址冲突 倒着复制*/
    else
    {
        dst = (char *)dst + count - 1;
        src = (char *)src + count - 1;
        while (count--)
        {
            *(char *)dst = *(char *)src;
            dst = (char *)dst - 1;
            src = (char *)src - 1;
        }
    }
    return(ret);
}


/************************************************************************************
memcpy() copies a source memory buffer to a destination memory buffer. This
routine does NOT recognize overlapping buffers, and thus can lead to propogation.For
cases where propagation must be avoided, memmove() must be used.
memcpy()由src指定内存区域拷贝count个字符到dst所指定的内存区域。
src和dst内存区域不能重叠,函数返回指向dst的指针。
函数原型: void *memcpy(void *dest, void *src, unsigned int count);


参数说明:dst为目的字符串,src为源字符串,count为要拷贝的字节数。
所在库名:#include <string.h>
函数功能:将字符串src中的前n个字节拷贝到dst中。
返回说明:src和dst所指内存区域不能重叠,函数返回void*指针。
//注意memcpy返回的是void*类型
附加说明: 指针src和dest所指的内存区域不可重叠
1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。
2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。
3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。
如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
//注意,source和destin都不一定是数组,任意的可读写的空间均可。
因为参数类型为void空指针
***********************************************************************************/
void * my_memcpy(void *dst,const void *src,int count)
{
    void * ret = dst;
    assert( (dst!=NULL)&&(src!=NULL) );
    while (count--)
    {
        *(char *)dst = *(char *)src;
        dst = (char *)dst + 1;
        src = (char *)src + 1;
    }
    return(ret);
}
/*****************************************************
Strcpy的函数原型: 
char *strcpy(char *dst, const char *src) 
函数功能: 
将字符串src拷贝到字符串dst中去。 
用法解析: 
在执行字符串拷贝之前,“用户需要保证”dst指向的空间足够大。
否则的话,可能会产生意想不到的后果。
头文件:string.h 
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 
返回指向dest的指针。如果src的结尾不是'\0'的话,那么系统会在src的结尾处自动加一个'\0'。 
在VC的库函数中,strcpy()的定义如下: 
*****************************************************/
char * __cdecl strcpy(char * dst, const char * src) 

    /*提高效率 不做类型安全检查*/
    char * cp = dst; 
    while( *cp++ = *src++ ); /* Copy src over dst */ /*注意这行有个分号*/ 
    return( dst );//为了实现链式操作,返回目的地址 
}
/************************************************************
strncpy
函数原型:extern char *strncpy(char *dest, char *src, int n); 
用法:#include <string.h> 
功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针(该指向dest的最后一个元素)
将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。
注意:如果源串长度大于n,则strncpy不复制最后的'\0'结束符,所以是不安全的,
复制完后需要手动添加字符串的结束符才行。
************************************************************/ 
char * strncpy(char * dest,const char *src,size_t count)

    char *tmp = dest;
    while (count-- && (*dest++ = *src++) != '\0')
    /* nothing */;
    return tmp;
}