首先strcpy、strncpy和memcpy都是标准C库函数
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
strncpy在strcpy的基础上提供了控制想要复制字符串长度,但是strncpy追加结束标记'\0'。
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
strcpy代码:
char* strcpy(char* dest, const char* src)//返回类型char*
{
assert(dest && src);//判断参数的有效性
char* ret = dest;//保存需要返回数组的首地址
while (*dest++ = *src++)//将src内容复制到dest
{
;
}
return ret;//返回dest地址
}
strncpy代码:
char* strncpy(char* dest, const char* src,size_t size)//返回类型char*
{
assert(dest && src);//判断参数的有效性
char* ret = dest;//保存需要返回数组的首地址
while (size--)//将src前size个字节的内容复制到dest
{
*dest++ = *src++;
}
return ret;//返回dest地址
}
memcpy代码:
void* memcpy(void* dest, void* src, size_t size)//返回类型void*,传入的两个值类型也看做void*,使得它可以拷贝其他类型
{
assert(dest && src);//判断参数的有效性
void* ret = dest;//保存需要返回数组的首地址,返回类型void*
while (size--)//将src前size个字节的内容复制到dest
{
*(char*)dest = *(char*)src;//强制转换成char*类型,因为char*类型的数据刚好一个字节
dest = (char*)dest + 1;//因为是void*类型,无法直接进行加减操作
src = (char*)src + 1;
}
return ret;//返回dest地址
}
总结:
1. 复制的内容不同。strcpy和strncpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2. 复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy和strncpy则是根据其第3个参数决定复制的长度。
3. 用途不同。通常在复制字符串时用strcpy和strncpy,而需要复制其他类型数据时则一般用memcpy。