// [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;
}
memcmp比较内存中对应值的大小
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;
}
strcat字符连接
// [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;
}
strcmp 字符串比较
// [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;
}