strcpy,strcmp,strcat,memcpy,memmov,memset,memcmp的实现

来源:互联网 发布:微电影编辑软件 编辑:程序博客网 时间:2024/05/02 10:46
[cpp] view plaincopy
  1. <span style="font-size:18px">//  [11/10/2013 qingezha] 直接拷贝,不考虑覆盖问题,效率优先  
  2. char* strcpy_my(char * dest,char * src) // 实现src到dest的复制  
  3. {  
  4.     if(!src||!dest)  
  5.         return NULL;  
  6.     char* stedest = dest;               //保存目标字符串的首地址  
  7.     while ((*dest++ = *src++)!='\0');   //这里是把结束符也复制进去了!!!!!!!!!!  
  8.     return stedest;                     //把src字符串的内容复制到dest下  
  9. }</span>  

strcpy 只针对字符,而memcpy针对内存,不管里面存放的是啥内容,可以拷贝内建类型与自定义类型,其他与strcpy一样,不考虑覆盖问题

[cpp] view plaincopy
  1. //  [9/22/2013 qingezha] 注意指针类型要转换,不能对void 类型进行++运算  
  2. //  但当源内存和目标内存存在重叠时,memcpy会出现错误,  
  3. //  而memmove能正确地实施拷贝,但这也增加了一点点开销。  
  4. void * my_memcpy(void *des, void *src, size_t count)  
  5. {  
  6.     if(des == NULL || src == NULL || count <= 0)   
  7.         return NULL;  
  8.     char *dess = (char *)des;           //这里要类型转换  
  9.     char *srcs = (char *)src;  
  10.     char *ret = dess;  
  11.     int temp = count;  
  12.     while(count)  
  13.     {  
  14.         *dess++ = *srcs++;  
  15.         --count;  
  16.     }  
  17.     *(ret + temp) = '\0';  
  18.     return ret;  
  19. }  
memmov移动时考虑覆盖问题,根据目的地址与源地址的相对位置,对应的采取从后向前拷贝还是从前向后拷贝

[cpp] view plaincopy
  1. //  [9/24/2013 qingezha] 判断地址重叠  
  2. void * my_memmov(void *dest, void *src, size_t n)  
  3. {  
  4.     {  
  5.         char*     d  = (char*) dest;  
  6.         const char*  s = (const char*) src;  
  7.   
  8.         if (s>d)             //目的地址在前面,从头复制  
  9.         {  
  10.             while (n--)  
  11.                 *d++ = *s++;  
  12.         }  
  13.         else if (s<d)            //目的地址在后面,从尾部复制  
  14.         {  
  15.             d = d+n-1;  
  16.             s = s+n-1;  
  17.   
  18.             while (n--)  
  19.                 *d-- = *s--;  
  20.         }  
  21.         return dest;  
  22.   
  23.     }  
  24. }  
memset 用来对一段内存空间置为某一个字符,或其他

[cpp] view plaincopy
  1. //  [11/10/2013 qingezha]  
  2. void* my_memset(char *ch,char c,size_t n)  
  3. {  
  4.     if(ch==NULL || n<=0)  
  5.         return ch;  
  6.     for (int i=0;i<n;i++)  
  7.     {  
  8.         ch[i]=c;  
  9.     }  
  10.     return ch;  
  11. }  

memcmp比较内存中对应值的大小

[cpp] view plaincopy
  1. int my_memcmp(const void *buf1,const void *buf2,size_t count)  
  2. {  
  3.     if (buf1==NULL||buf2==NULL||count<=0)  
  4.     {  
  5.         return 0;  
  6.     }  
  7.     while(count--&&*(char*)buf1==*(char*)buf2)  
  8.     {  
  9.         buf1=(char*)buf1+1;  
  10.         buf2=(char*)buf2+1;  
  11.     }  
  12.     return *(char*)buf1-*(char*)buf2;  
  13. }  

strcat字符连接

[cpp] view plaincopy
  1. //  [11/10/2013 qingezha]  
  2. char * my_strcat(char *des,const char *src)  
  3. {  
  4.     if (des==NULL||src==NULL)  
  5.     {  
  6.         return des;  
  7.     }  
  8.     char *ch = des;  
  9.     while(*ch)  
  10.         ch++;  
  11.     while(*ch++=*src++);  
  12.     return des;  
  13. }  

strcmp 字符串比较

[cpp] view plaincopy
  1. //  [11/10/2013 qingezha]  
  2. int my_strcmp(const char *des,const char *src)  
  3. {  
  4.     int dis=0;  
  5.     while(!(dis=*des-*src)&&*des&&*src)//相同的时候继续比较  
  6.     {  
  7.         src++;  
  8.         des++;  
  9.     }  
  10.     if (dis>0)  
  11.     {  
  12.         dis = 1;  
  13.     }   
  14.     else  
  15.     {  
  16.         dis = -1;  
  17.     }  
  18.     return dis;  
  19. }  
0 0