// [11/10/2013 qingezha] 直接拷贝,不考虑覆盖问题,效率优先
char* strcpy_my(char * dest,char * src) // 实现src到dest的复制
{
if(!src||!dest)
return NULL;
char* stedest = dest; //保存目标字符串的首地址
while ((*dest++ = *src++)!='\0'); //这里是把结束符也复制进去了!!!!!!!!!!
return stedest; //把src字符串的内容复制到dest下
}
strcpy 只针对字符,而memcpy针对内存,不管里面存放的是啥内容,可以拷贝内建类型与自定义类型,其他与strcpy一样,不考虑覆盖问题
// [9/22/2013 qingezha] 注意指针类型要转换,不能对void 类型进行++运算 // 但当源内存和目标内存存在重叠时,memcpy会出现错误, // 而memmove能正确地实施拷贝,但这也增加了一点点开销。 void * my_memcpy(void *des, void *src, size_t count) { if(des == NULL || src == NULL || count <= 0) return NULL; char *dess = (char *)des; //这里要类型转换 char *srcs = (char *)src; char *ret = dess; int temp = count; while(count) { *dess++ = *srcs++; --count; } *(ret + temp) = '\0'; return ret; }memmov移动时考虑覆盖问题,根据目的地址与源地址的相对位置,对应的采取从后向前拷贝还是从前向后拷贝
// [9/24/2013 qingezha] 判断地址重叠 void * my_memmov(void *dest, void *src, size_t n) { { char* d = (char*) dest; const char* s = (const char*) src; if (s>d) //目的地址在前面,从头复制 { while (n--) *d++ = *s++; } else if (s<d) //目的地址在后面,从尾部复制 { d = d+n-1; s = s+n-1; while (n--) *d-- = *s--; } return dest; } }memset 用来对一段内存空间置为某一个字符,或其他
// [11/10/2013 qingezha] void* my_memset(char *ch,char c,size_t n) { if(ch==NULL || n<=0) return ch; for (int i=0;i<n;i++) { ch[i]=c; } return ch; }
int my_memcmp(const void *buf1,const void *buf2,size_t count) { if (buf1==NULL||buf2==NULL||count<=0) { return 0; } while(count--&&*(char*)buf1==*(char*)buf2) { buf1=(char*)buf1+1; buf2=(char*)buf2+1; } return *(char*)buf1-*(char*)buf2; }
// [11/10/2013 qingezha] char * my_strcat(char *des,const char *src) { if (des==NULL||src==NULL) { return des; } char *ch = des; while(*ch) ch++; while(*ch++=*src++); return des; }
// [11/10/2013 qingezha] int my_strcmp(const char *des,const char *src) { int dis=0; while(!(dis=*des-*src)&&*des&&*src)//相同的时候继续比较 { src++; des++; } if (dis>0) { dis = 1; } else { dis = -1; } return dis; }