strcpy,memcpy,memmove,memset

来源:互联网 发布:php棋牌游戏源码下载 编辑:程序博客网 时间:2024/05/17 00:04
/*strcpy实现,注意:1、只能实现字符串的copy2、注意函数中参数,第二个有const3、注意返回为char*,以实现链式表达式4、简洁的赋值写法,注意别把=写成了==*/char* MyStrcpy(char* dest,const char* source){if(dest==NULL||source==NULL)return NULL;char* strDest=dest;while((*strDest++=*source++)!='\0');return dest;}

/*memcpy实现,注意:1、memcpy是要保证内存区域不发生覆盖的基础上copy2、注意函数的参数的类型,void*为返回值,参数为void*和const void*第三个参数决定了复制的长度3、最后返回dst,不要手贱加上'\0'*/void* MyMemcpy(void* dest,const void* source,size_t size){if(dest==NULL||source==NULL||size<=0)return NULL;char* pdest=(char*)dest;char* psource=(char*)source;assert(!((pdest>psource)&&(psource+size>pdest)));while(size--){*pdest++=*psource++;}return dest;}

/*memmove同上的主要区别是保证即使内存重叠了,目的地址也能被拷贝正确*/void* Mymemmove(void* dest,const void* source,size_t size){if(dest==NULL||source==NULL||size<=0)return NULL;char* pdest=(char*)dest;char* psource=(char*)source;if((pdest>psource)&&(psource+size>pdest)){pdest+=size-1;psource+=size-1;while(size--){*pdest--=*psource--;}}else{    while(size--){ *pdest++=*psource++;}}return dest;}

/*strcmp函数注意:1、返回值为int型,str1大于str2返回正数,相等返回0,小于返回负数2、形参为const char*型3、检查指针有效性4、注意代码简洁性*/int mystrcmp(const char *str1, const char *str2){      assert(str1 != NULL && str2 != NULL);      if(str1 == str2){          return 0;      }      // 这里的*str1和*str2都必须有,网上有的只检查str1,是错误的!!!      // while(*str1 && *str1++ == *str2++); //error      while(*str1 && *str2 && (*str1++ == *str2++));      return *str1 - *str2;  }  

/*1、注意返回为void*2、形参为void*,char c,和size_t 类型的size3、指针有效性的判断4、简洁性*/void* Mymemset(void* buffer,int c,size_t size){assert(buffer!=NULL);char* pbuffer=(char*)buffer;while(size--){*pbuffer++=(char)c;}return buffer;}


0 0
原创粉丝点击