strcpy与memcpy的实现与区别

     今天遇到一个问题。本来自己存的一个数据块是char *,使用strcpy拷贝到另一个char*指针后,发现接收端数据不对。使用memcpy正常。仔细查找发现问题。当存储的数据中含有0或者“\0”的数据时,使用strcpy会出错。strcpy只拷贝字符串,遇到\0就不再拷贝,与自己的预想不符,strcpy还容易发生越界的问题。

    面试的时候也经常会遇到让你写这些标准库函数的具体实现,其实在vs的环境下可以直接打开这些函数的实现。

memcpy的一种实现:


void * __cdecl memcpy (void * dst,const void * src,size_t count)
{
        void * ret = dst;                              //将目的地址指向原数据地址
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;     //将原数据给目的地址赋值
                dst = (char *)dst + 1;             //目的地址指向下一位
                src = (char *)src + 1;             //原地址指向下一位
        }

        return(ret);                                   //返回目的地址指针
}


strcpy的一种实现:

其中while( *cp++ = *src++ )语句的意思是判断*cp的值是否为0,

等价于while( (*cp++ = *src++) != 0 )

/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
*       Copies the string src into the spot specified by
*       dest; assumes enough room.
*
*Entry:
*       char * dst - string over which "src" is to be copied
*       const char * src - string to be copied over "dst"
*
*Exit:
*       The address of "dst"
*
*Exceptions:
*******************************************************************************/


char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;

        while( *cp++ = *src++ ) ;               /* Copy src over dst ,遇到\0结束拷贝*/

        return( dst );
}


关于strcpy已经实现了将原字符串拷贝到目的字符串,为什么还要char * 类型的返回值。

有时候函数原本不需要返回值,为了实现链式表达(就是代码可以一连串写出来,不用中间变量保存),增加了代码的灵活性。

例如 int length = strlen( strcpy( strDest, “hello world”) );


如果参数是指针,且仅作输入用,则应在类型前加const,以防止指针在函数内被意外修改。


你可能感兴趣的:(面试)