1. 模拟实现strcpy()
-
函数说明
strcpy()会将src字符串拷贝带dest所指的地址。 -
返回值
返回参数dst的字符串起始地址。 -
附加说明
如果参数dst所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况, 在编写程序时请特别留意, 或者用strncpy()来取代。
//字符串拷贝
char* strcpy(char *dst, const char *src)
{
assert(dst != NULL && src != NULL);
char *ret = dst;
while (*dst++ = *src++);
return ret;
}
2. 模拟实现strcat()
-
函数说明
strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dst要有足够的空间来容纳要拷贝的字符串。 -
返回值
返回参数dst的字符串起始地址
//字符串拼接
char* strcat(char *dst, const char *src)
{
assert(dst != NULL && src != NULL);
char *ret = dst;
while (*dst)
dst++;
while (*dst++ = *src++);
return ret;
}
3. 模拟实现strstr()
-
函数说明
strstr()会从字符串haystack 中搜寻字符串needle,并将第一次出现的地址返回。 -
返回值
返回指定字符串第一次出现的地址,否则返回0。
//源字符串中是否包含要查找的字符串
char *my_strstr(const char *haystack, const char *needle)
{
assert(haystack, != NULL && needle != NULL);
char *str1 = haystack;
char *str2 = needle;
if (*needle == 0)
return NULL;
while (*str1)
{
while (*str1 && *str2 && (*str1 == *str2))
{
str1++;
str2++;
}
if (*str2 == 0)
return haystack;
else
{
str2 = needle;
str1 = ++haystack;
}
}
return NULL;
}
4. 模拟实现strchr()
- 函数说明
strchr()用来找出参数src字符串中第一个出现的参数character地址,然后将该字符出现的地址返回。 - 返回值
如果找到指定的字符则返回该字符所在地址,否则返回0。
//在字符串中查找指定字符
char *strchr(const char *src, int character)
{
assert(src != NULL);
char *str_src = src;
while (*str_src != character && *str_src != '\0')
str_src++;
if (*str_src == character)
return str_src;
else
return NULL;
}
5. 模拟实现strcmp()
-
函数说明
strcmp()用来比较参数s1和s2字符串。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符, 若差值不为0则将差值返回。 例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和’b’(98)的差值(-33)。 -
返回值
若参数s1和s2字符串相同则返回0。 s1若大于s2则返回大于0的值。s1若小于s2则返回小于0的值。
int my_strcmp(const char *dst, const char *src)
{
assert(dst != NULL && src != NULL);
int ret = 0;
while (!(ret = *(unsigned char *)dst - *(unsigned char *)src) && *dst)
{
dst++;
src++;
}
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
else
return 0;
}
6. 模拟实现memcpy()
- 函数说明
memcpy()用来拷贝src所指的内存内容前n个字节到dst所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束’\0’而结束。 - 返回值
返回指向dest的指针。
void *my_memcpy(void *dst, const void *src, size_t count)
{
assert(dst != NULL && src != NULL);
char *dst1 = (char *)dst;
char *src1 = (char *)src;
for (int i = 0; i < count; i++)
dst1[i] = src1[i];
return dst;
}
7. 模拟实现memmove()
-
函数说明
memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是 当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。 -
返回值
返回指向dest的指针。 -
函数说明
指针src和dest所指的内存区域可以重叠。(以下给出避免重叠的方法)
//内存拷贝(避免内存重叠)
void *my_memmove(void *dst, void *src, size_t count)
{
assert(dst != NULL && src != NULL);
char *str_dst = (char *)dst;
char *str_src = (char *)src;
if (dst < src)
{
//前重叠或前不重叠,从前向后拷
for (int i = 0; i < count; i++)
str_dst[i] = str_src[i];
}
else
{
//后重叠或后不重叠,从后往前拷
for (int i = count - 1; i >= 0; i--)
str_dst[i] = str_src[i];
}
return dst;
}
转载:https://blog.csdn.net/yangke369/article/details/105922364