一. strcpy函数
1. strcpy的原型是char* strcpy(char *des, const char *src); 返回des指针。
作用是把src指针指向的字符串复制到des指针指向的字符串中。
2. des所指向的内存空间要足够大保证能够容纳src所指的字符串,strcpy函数碰到第一个\0字符的时候结束复制
3. strcpy函数的实现,考虑内存重叠
//strcpy函数实现
char* strcpy(char *des, const char *src){
//空指针报异常
if(des == NULL || src == NULL){
throw exception("error");
return NULL;
}
//如果是自己复制自己直接返回
if(des == src){
return des;
}
//求出stc指向的字符串长度
int length = strlen(src);
//考虑内存重叠
if((des > src) && (des < src+length)){
//从后往前复制
for(int i = length-1; i >= 0; i--){
des[i] = src[i];
}
}
else{
//从前往后复制
for(int i = 0; i < length; i++){
des[i] = src[i];
}
}
//最后一位赋值为\0
des[length] = '\0';
return des;
}
二. memcpy函数
1. memcpy是C语言中的内存复制函数,它的函数原型是 void* memcpy(void *des, const void *src, size_t count),返回des指针变量。
作用是把src指向的内存地址空间中的count个字节复制到des指向的内存空间。
2. des和src所指向的内存空间是不能重叠的,memcpy可以复制任何数据类型,并且必须复制count个字节。
3. memcpy函数的实现,考虑内存重叠
void* memcpy(void *des, const void *src, size_t count){
//如果是空指针抛异常
if(des == NULL || src == NULL){
throw exception("error");
return NULL;
}
//如果自己复制自己直接返回
if(des == src){
return des;
}
//转化为字符指针类型
char *tmpDes = (char*)des;
char *tmpSrc = (char*)src;
//考虑内存重叠
if((tmpDes > tmpSrc) && (tmpDes < (tmpSrc+count))){
//从后往前复制
for(size_t i = count-1; i >= 0; i--){ //注意i是size_t类型
tmpDes[i] = tmpSrc[i];
}
}
else{
//从前往后复制
for(size_t i = 0; i < count; i++){ //注意i是size_t类型
tmpDes[i] = tmpSrc[i];
}
}
return des;
}
三. strcpy和memcpy的区别
1. strcpy是用来复制字符串的,memcpy是用来复制一段内存的
2. strcpy复制字符串的时候遇到\0就结束,memcpy必须复制指定大小的内存才结束