一、memcpy实现:
void* mymemcpy(void* dest, const void* src, size_t count) {
assert(dest != NULL && src != NULL);
char* pdest = static_cast<char*>(dest);
const char* psrc = static_cast<const char*>(src);
if(pdest > psrc && pdest < psrc+count) {
for(size_t i = count-1; i != -1; i--) {
pdest[i] = psrc[i];
}
}
else {
for(size_t i = 0; i < count; i++) {
pdest[i] = psrc[i];
}
}
return dest;
}
二、strcpy实现:
//比较典型的实现方法
char* mystrcpy(char* dest, const char* src) {
if(dest == NULL || src == NULL) return NULL;
if(dest == src) {
return dest;
}
char* tempptr = dest;
while((*dest++ = *src++) != '\0');
return tempptr;
}
//更为严谨的实现方法(考虑内存叠加的情况,但是这样可能会有内存越界的情况,显然是不安全的。虽然实际调用strcpy的时候也可以支持strcpy(str+1, str)这种情况,但是这样做显然是不安全的。这个实现方法只是为了更接近真实的strcpy)
char* mystrcpy1(char* dest, const char* src) {
assert(dest != NULL && src != NULL);
char* psrc = const_cast<char*>(src);
size_t len_src = 0;
while(*psrc++ != '\0') len_src++;
if(dest > src && dest < src+len_src) {
for(size_t i = len_src; i != -1; i--) {
dest[i] = src[i];
}
}
else {
for(size_t i = 0; i <= len_src; i++) {
dest[i] = src[i];
}
}
return dest;
}
三、strncpy实现:
char* mystrncpy(char* dest, const char* src, size_t count) {
assert(dest != NULL && src != NULL);
size_t i = 0;
for(i = 0; i < count; i++) {
dest[i] = src[i];
if(dest[i] == '\0') break;
}
if(i == count) dest[i] = '\0';
return dest;
}
四、strlen实现:
//使用一个中间变量实现
size_t mystrlen(const char* str) {
if(str == NULL || *str == '\0') {
return 0;
}
size_t count = 0;
while(*str++ != '\0') {
count++;
}
return count;
}
//不使用中间变量,递归实现方法1
size_t mystrlen1(const char* str) {
if(str == NULL || *str == '\0') {
return 0;
}
return mystrlen(str+1) + 1;
}
//不使用中间变量,递归实现方法2
size_t mystrlen2(const char* str) {
if(str == NULL ) {
return 0;
}
return *str ? (mystrlen2(++str)+1) : 0;
}
五、strcat实现:
char* mystrcat(char* dest, const char* src) {
char* tempptr = dest;
while(*dest != '\0') dest++;
while((*dest++ = *src++) != '\0');
return tempptr;
}
六、strcmp实现:
int mystrcmp(const char* str1, const char* str2) {
int ret = 0;
while(!(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str1) {
str1++;
str2++;
}
if(ret > 0)
return 1;
else if(ret < 0)
return -1;
else
return 0;
}
记录在此,方便以后回顾。