1.实现strcpy :拷贝字符串
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest++ = *src++ !='\0')
{
;
}
return ret;
}
注意:strcpy会将\0也拷贝,但是需要注意目标地址有足够的空间进行拷贝。
2.实现strcat :字符串追加。strcat也会把src的\0拷贝到末尾,需要保证空间足够。
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest != '\0')/找到目标字符串的结尾
dest++;
while (*dest++ = *src++)
{
;
}
return ret;
}
3.实现strstr :在一个字符串里查找它的子串。
char* my_strstr(const char* str, const char* substr)
{
assert(str);
assert(substr);
const char* s1 = str;
const char* s2 = substr;
const char* cur = str;
if (*substr == '\0')
return str;
while (*cur)
{
s1 = cur;
s2 = substr;
while (*s1&&*s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)cur;
cur++;
}
return NULL;
}
4.实现strchr :字符串中查找字符。
char* my_strchr(const char* str, const char ch)
{
assert(str);
while (*str != '\0')
{
if (*str == ch)
return (char*)str;
}
return NULL;
}
5.实现strcmp :字符串比较。相等返回0。
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
6.实现memcpy :
memcpy和strcpy的区别:
1>复制内容不同,strcpy只能复制字符串,memcpy可以复制任意内容。
2>strcpy一直复制到有\0,memcpy是按照给定长度复制。
void* my_memcpy(void* dest, void* src, int count)
{
assert(dest);
assert(src);
int i = 0;
void* ret = dest;
while (i<count)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
i++;
}
return ret;
}
7.实现memmove:当memcpy有内存重叠时使用memmove
void* my_memmove(void* dest, const void* src, int count)
{
assert(dest);
assert(src);
void* ret = dest;
if (dest < src)
{
//从前向后拷贝
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//从后向前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}