strcpy,memcpy,memmove函数之间的区别及源码
2016-06-20 21:51
375 查看
strcpy和memcpy都是标准C库函数,它们有下面特点:
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。
strcpy的函数原型是:char* strcpy(char* dest, const char* src);
memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。
memcpy的函数原型是:void *memcpy(void *dest, const char* src, size_t count);
View
Code
1 char *strcpy(char *dest, const char *src)
2 {
3 if((src == NULL) || (dest == NULL))
4 {
5 return NULL;
6 }
7
8 char *strdest = dest; // 保存目标字符串的首地址
9 while((*dest++ = *str) != '\0');
10 return strdest;
11 }
void *memcpy(void *memTo, const char *memFrom, size_t size)
{
if((memTo == NULL) || (memFrom == NULL))
{
return NULL;
}
char *tempFrom = (char *)memFrom; //保存memFrom的首地址
char *tempTo = (char *)memTo; //保存memTo的首地址
while(size-- > 0)
{
*tempTo++ = *tempFrom++;
}
return memTo;
}
strcpy 和 memcpy主要有以下三方面的区别:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。
当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?
memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。
而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。
void *memmove(void *dst,const void *src,int n)
{
char *dp = (char *)dst;
char *sp = (char *)src;
assert((src!=0)&&(dst!=0)&&(n>0));//not null
//非重叠
//dp < sp
//dp > (sp+n)
if(sp>dp||(sp+n)<dp)
{
while(n--)
*(dp++) = *(sp++);
*dp = '\0';
}
else if(sp<dp)//重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回
{//反向拷贝
sp += n;
dp += n;
*dp = '\0';
while(n--)
*(--dp) = *(--sp);
}
return dst;
}
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。
strcpy的函数原型是:char* strcpy(char* dest, const char* src);
memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广。
memcpy的函数原型是:void *memcpy(void *dest, const char* src, size_t count);
View
Code
1 char *strcpy(char *dest, const char *src)
2 {
3 if((src == NULL) || (dest == NULL))
4 {
5 return NULL;
6 }
7
8 char *strdest = dest; // 保存目标字符串的首地址
9 while((*dest++ = *str) != '\0');
10 return strdest;
11 }
void *memcpy(void *memTo, const char *memFrom, size_t size)
{
if((memTo == NULL) || (memFrom == NULL))
{
return NULL;
}
char *tempFrom = (char *)memFrom; //保存memFrom的首地址
char *tempTo = (char *)memTo; //保存memTo的首地址
while(size-- > 0)
{
*tempTo++ = *tempFrom++;
}
return memTo;
}
strcpy 和 memcpy主要有以下三方面的区别:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。
memcpy 和 memmove 都是C语言中的库函数,在库函数 string.h中,其原型相似,它们都是从src所指向的内存中复制count个字节到dest所指内存中。并返回dest的值。
当源内存区域 和 目标内存区域无交叉重叠时,两者的结果是一样的,但如果有交叉呢?
memcpy是从src的其实部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,交叉部分的src内容就会被覆盖掉了。
而memmove则由于采用不同的复制机制,所以可以正确处理第二种情况。
void *memmove(void *dst,const void *src,int n)
{
char *dp = (char *)dst;
char *sp = (char *)src;
assert((src!=0)&&(dst!=0)&&(n>0));//not null
//非重叠
//dp < sp
//dp > (sp+n)
if(sp>dp||(sp+n)<dp)
{
while(n--)
*(dp++) = *(sp++);
*dp = '\0';
}
else if(sp<dp)//重叠 (此时条件 sp<dp<(sp+n))如果sp==dp则快速的返回
{//反向拷贝
sp += n;
dp += n;
*dp = '\0';
while(n--)
*(--dp) = *(--sp);
}
return dst;
}
相关文章推荐
- POJ 2828 逆序插入加线段树
- jvm-GC
- numpy函数:tile函数
- 算法竞赛入门经典(第2版)习题1-4详解
- 替换空格
- linux shell取文本最后一行
- 字符串常量
- 8-141 类模版含有多个类型参数
- java 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下
- 20150502管道、字符串
- 1001-专题四
- HDOJ 2544 最短路(四种做法)
- 什么是Intent(意图)
- Poj 2226 Muddy Fields【二分匹配】
- 关于软件开发团队的一些思考
- 【c++程序】不同字符的个数统计
- javascript之DOM操作
- 55. Jump Game
- libvlc 打开较大MP4文件,关闭慢的问题.
- ubuntu samba服务器的安装和出错修改