1.实现strcpy
char *my_strcpy(char *dest, const *src)
{
char *ret = dest;
assert(dest&&src);
while (*dest++=*src++)
{
;
}
return ret;
}
2.实现strcat
char *my_strcat(char *dest, const *src)
{
char *ret = dest;
assert(dest&&src);
while (*dest)
{
;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
3.实现strstr
char* my_strstr(const char* src, const char *sub)
{
//用来判断,故不修改原值,设置另外两个参数进行比较
const char *srci = src;
const char *subi = sub;
while (*srci != '\0')
{
while (*srci == *subi&&*subi != '\0')
{
srci++;
subi++;
}
if (*subi == '\0')
{
return src;
}
//为了避免出现str:aaaabcd, sub:aabc这种情况,增加以下内容,当首次比较完成后,
//若subi不为src的字串,srci应该加1并向下执行。
else
{
subi = sub;
src++;
srci = src;
}
}
return NULL;
}
5.实现strcmp
int my_strcmp(const char *str1, const char* str2)
{
int ret = 0;
assert(str1&&str2);
unsigned char *s1 = (unsigned char*)str1;
unsigned char *s2 = (unsigned char*)str2;
while (*s1&&*s2)
{
if (*s1 > *s2)
{
return 1;
}
else if (*s1 < *s2)
{
return -1;
}
else
{
++s1;
++s2;
}
}
if (*s1 == '\0'&&*s2 == '\0')
{
return 0;
}
else if (*str1 == '\0')
{
return -1;
}
else
{
return 1;
}
}
6.实现memcpy
void *my_memcpy(void *dest, const void *src, size_t num)
{
assert(dest&&src);
char *str_dest = (char *)dest;
char *str_src = (char *)src;
//之所以不能用以前strcpy,是因为这个copy没有返回值,没有结束语句
for (size_t i = 0; i < num; i++)
{
str_dest[i] = str_src[i];
}
return dest;
}
7.实现memmove
void * my_mommove(void *dest, const void *src, size_t num)
{
assert(dest&&src);
char* str_dest = (char *)dest;
char* str_src = (char *)src;
//此处分为前重叠和后重叠
//前重叠时,可以正常拷贝,不会存在覆盖情况
if (dest > src)
{
for (size_t i = 0; i < num; i++)
{
str_dest[i] = str_src[i];
}
}
//后重叠时,需从后向前拷贝,这样数据不会丢失
if (src>dest)
{
for (size_t i = num - 1; i > 0; i--)
{
str_dest[i] = str_src[i];
}
}
return dest;
}