1.模拟实现strcpy
char* my_strcpy(char* dst, const char*src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while (*dst = *src)
{
dst++, src++;
}
return ret;
}
2.模拟实现strncpy
char* my_strncpy(char* dst,const char* src,int n)
{
assert(dst!=NULL);
assert(src!=NULL);
char* ret=dst;
while(n)
{
*dst=*src;
dst++;
src++;
n--;
}
if(*(dst-1)!='\0')
{
*dst='\0';
}
return ret;
}
3.模拟实现strcat
char *my_strcat(char* dst, char* src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while (*dst)
{
dst++;
}
while (*dst = *src)
{
dst++, src++;
}
return ret;
}
4.模拟实现strncat
char *my_strncat(char* dst, const char *src, int n)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while (*dst)//将dst的指针移到‘\0'处
{
dst++;
}
while (n)
{
*dst = *src;
dst++, src++;
n--;
}
if (*(dst - 1) != '\0')
{
*dst = '\0';
}
return ret;
}
5.模拟实现strncmp
int my_strncmp(const char *src, const char *dst, int n)
{
assert(src != NULL);
assert(dst != NULL);
int ret = 0;
while (n)
{
ret = *(unsigned char*)src - *(unsigned char*)dst;
src++, dst++;
n--;
if (ret < 0)
{
ret = -1;
}
else if (ret>0)
{
ret = 1;
}
else{
ret = 0;
}
}
return ret;
}
6.模拟实现strcmp
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 != NULL);
assert(s2 != NULL);
int res = 0;
int ret=0;
while (!(ret = *(unsigned char*)s1 - *(unsigned char*)s2) && *s1)
{
s1++, s2++;
}
if (ret < 0)
{
res = -1;
}
else if (ret>0)
{
res = 1;
}
else{
res = 0;
}
return(res);
}
6.模拟实现strncmp
int my_strncmp(const char *src, const char *dst, int n)
{
assert(src != NULL);
assert(dst != NULL);
int ret = 0;
while (n)
{
ret = *(unsigned char*)src - *(unsigned char*)dst;
src++, dst++;
n--;
if (ret < 0)
{
ret = -1;
}
else if (ret>0)
{
ret = 1;
}
else{
ret = 0;
}
}
return ret;
}
7.模拟实现strstr
char *my_strstr(char*str, char*sub_str)
{
assert(str);
assert(sub_str);
char *p = NULL;
char *np = NULL;
char *q = NULL;
p = str;
while (*p)
{
np = p;//np始终在p的前面
q = sub_str;
for (; *np&&*q&&*np == *q; np++, q++)//指针np和指针q都不能为空,且np指的内容和q的内容相等
{
;
}
if (*q == '\0')//说明已经找到
{
return p;
}
else if (*np == '\0')//q还没找完,p已经找完,就没必要再找了
{
break;
}
else{ //走到这儿说明p没到'\0',q也没到'\0',只能是*np!=*q;
p++;
}
}
return NULL;
}
8.模拟实现memcpy(内存拷贝)
void *my_memcpy(void *dst, const void *src, int num)
{
assert(dst);
assert(src);
char *_dst = (char *)dst;
const char *_src = (const char *)src;
while (num--)
{
*_dst = *_src;
_dst++, _src++;
}
return dst;
}
9.模拟实现memmove(从src拷贝num个字节到dst)
void *my_memmove(void *dst, const void *src, int num)
{
assert(dst);
assert(src);
char *_d = (char*)dst;
char *_s = (char*)src;
if (_d > _s&&_d < _s + num) //从右往左拷贝
{
*_d += num;
*_s += num;
while (num--)
{
*_d = *_s;
_d--, _s--;
}
}
else
{
while (num--)
{
*_d = *_s;
_d++, _s++;
}
}
return dst;
}