一些基础函数的实现
1. memcpy
函数原型 void * memcpy ( void * destination, const void * source, size_t num );
(1) 复制指向source位置的num个字节的值直接到指向destination的内存区域中。
(2) source和destination指向的数据类型不用相关,这是二进制复制。
(3) source指向的区域和destination指向的区域不要重叠。
(4) 函数返回destination。
思路一:
void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&&(src!=NULL)); assert(des>=src+num||src>dst+num); // 考虑重叠的情况 byte * psrc = (byte *)src;//byte 既为unsigned char类型 byte * pdst = (byte *)dst; while(num-->0)*pdst++ = *psrc++; return dst; }
实现2:考虑重叠,有重叠情况也复制
void * mymemcpy(void *dest, const void *src, size_t count) { if (dest == NULL || src == NULL) return NULL; char *pdest = static_cast <char*>(dest); const char *psrc = static_cast <const char*>(psrc); int n = count; if (pdest > psrc && pdest < psrc+count) { for (size_t i=n-1; i != -1; --i) { pdest[i] = psrc[i]; } } else { for (size_t i= 0; i < n; i++) { pdest[i] = psrc[i]; } } return dest; }
3 . 再改进
void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&&(src!=NULL)); int wordnum = num/4;//计算有多少个32位,按4字节拷贝 int slice = num%4;//剩余的按字节拷贝 int * pintsrc = (int *)src; int * pintdst = (int *)dst; while(wordnum--)*pintdst++ = *pintsrc++; while (slice--)*((char *)pintdst++) =*((char *)pintsrc++); return dst; }
2. strcmp函数实现:
函数原型:int strcmp(const char *dest, const char *source) ;
返回值:返回整数值,如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest < source ,则返回值小于0。字符大小是按照字符的字典序列进行排列的。
参数说明:都是以''/0''为结束符的字符串实现;
int strcmp(const char *dest, const char *source) { assert((NULL != dest) && (NULL != source)); while (*dest && *source && (*dest == *source)) { dest ++; source ++; } return *dest - *source;
3. 已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != '\0' )
NULL ;
return address ;
}
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了实现链式表达式。
例如 int length = strlen( strcpy( strDest, “hello world”) );
4 .