void *Mymemcpy(void *dest, void *src, size_t size)
{
if(dest == nullptr || src == nullptr)
return nullptr;
void *result = dest;
if(dest < src || (char*)src+size < (char*)dest) {
while(size--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}
} else {
dest = (char*)dest+size-1;
src = (char*)src+size-1;
while(size--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest-1;
src = (char*)src-1;
}
}
return result;
}
int main() {
std::string data = "abcdefg";
Mymemcpy((void *)(data.data() + 1), (void *)data.data(), 4);
std::cout << data << std::endl;
return 0;
}
char * My_strcpy(char *dst,const char *src)
{
assert(dst != NULL && src != NULL);
char *ret = dst;
Mymemcpy(dst, src, strlen(src)+1);
return ret;
}
注意点:
- 考虑内存重叠
- 为啥返回char* --使函数能够支持链式表达式
比如:
int l = strlen(strcpy(strA,strB, n));
strstr 字符串匹配 实现
const char* strstr(const char* src, const char* sub)
{
const char *bp;
const char *sp;
if(!src || !sub)
{
return src;
}
while(*src)
{
bp = src;
sp = sub;
do
{
if(*sp == '\0')
return src;
} while (*bp++ == *sp ++);
src++;
}
return NULL;
}