C语言中字符串拷贝(strcpy)与内存拷贝(memcpy)的实现

1.字符串拷贝的实现

函数原型具体如下:

char* strcpy(char* dest, const char* src);该函数的两个字符指针参数所指向的内存会从外面传进来。

说明:如果src字符串长度比dest字符串长度要长,那么在复制的时侯,多余的字符任将被复制,它们将覆盖原先存储于dest数组后面的内存空间的值;这样的结果是未定义的,可以用strncpy来替代strcpy来预防该问题。

函数简单实现如下:

char* strcpy(char* dest, const char* src)

{

if (dest == NULL || src == NULL) return NULL;

char* temp = dest;

*temp = *src;

while(*temp != '\0')

{

temp++; 

src++;

*temp = *src

}

//简单版while((*temp++ = *src++) != '\0');  while(*temp++ = *src++)

return dest;

}

函数传入参数有内存重叠时,实现如下:

char* strcpy(char* dest, const char* src)

{

if (dest == NULL || src == NULL) return NULL;

char* temp = dest;

int length = strlen(src);

int i;

if (dest > src && dest < src + length)

{

for(i = length; i > 0; i--)

{

dest[i] = src[i];

}

}

else

while((*temp++ = *src++) != '\0');

return dest;

}

2.内存拷贝的实现:

函数原型具体如下:

void* memcpy(void* dest, const void* src, int size);void*可以指向任何类型的指针

函数简单实现如下:

void* memcpy(void* dest, const void* src, int size)

{

if (dest == NULL || src ==NULL || size == 0) return NULL;

char* temp = (char*)dest;

while(size--)

{

*temp++ = *(char*)src++;

}

return dest;

}

函数传入参数有内存重叠时,实现如下:

void* memcpy(void* dest, const void* src, int size)

{

if (dest == NULL || src ==NULL || size == 0) return NULL;

char* temp = (char*)dest;

int i;

if (dest > src || dest < src + size)

{

for(i = size; i > 0; i--)

{

temp[i] = src[i];

}

}

else

{

while(size--)

{

*temp++ = *(char*)src++;

}

}

return dest;

}


你可能感兴趣的:(基本语法与类库的实现)