strcpy 字符串的复制(拷贝),并且将源字符串中的“\0”拷贝进去。
/*strcpy的模拟实现*/
char* my_strcpy(char* des, char* src)
{
char* ret = des;
assert(des != NULL);
assert(src != NULL);
while ((*des++ = *src++))
{
;
}
return ret;
}
strlen 字符串将“\0”作为结束标志,strlen函数返回值的是在字符串中“\0”前面出现的字符个数(不包含“\0”),返回值为size_t。
/*strlen的模拟实现*/
//方法一:计数器实现方式
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
//方式二:不创建临时变量count,采用递归
int my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
{
return 1 + my_strlen(str + 1);
}
}
//方式三:指针减指针的方式
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
{
p++;
}
return p - s;
}
strstr strstr是C语言中的函数,作用是返回字符串中首次出现子串的地址。
/*strstr模拟实现*/
char* my_strstr(const char* str1, const char* str2)//因为返回的是地址
{
assert(str1&&str2);
if (*str1||*str2)
{
return NULL;
}
char* cp = (char*)str1;
while (*cp)
{
char* p1 = (char*)str1;
char* p2 = (char*)str2;
while (*p1&&*p2 && (*p1 == *p2))
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
//char *strstr(const char *str1, const char *str2) {
// char *cp = (char *)str1;
// char *s1, *s2;
// if (!*str2)
//return ((char *)str1);
// while (*cp) {
////回溯算法
//s1 = cp;
//将s1回到cp的起始位置
//s2 = (char *)str2;
//将s2回到str2的起始位置
//while (*s1 && *s2 && !(*s1 - *s2))
//s1++, s2++;
//if (!*s2)
//return (cp);
//cp++;
// }
// return NULL;
//}
memcpy 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到“\0”的时候不会停止下来。
/*memcpy模拟实现*/
//因为memcpy函数在实现的时候,不知道未来会被用来拷贝什么类型的函数,所以用void*用来接收
void* my_memcpy(void* des, const void* src, size_t count)
{
assert(des&&src);
void* ret = des;
while (count--)
{
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = https://www.it610.com/article/(char*)src + 1;
}
return ret;
}
memmove 支持重叠拷贝
/*memmove 模拟实现*/
void* my_memmove(void* dest,const void* src,size_t count)
{
void* ret = dest;
assert(dest&&src);
if (dest < src)
{
//从前-》后拷贝
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = https://www.it610.com/article/(char*)src + 1;
}
}
else
{
//从后向前
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
strcmp 第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
int my_strcmp(const char* dest, const char* src)
{
int ret = 0;
assert(dest&&src);
while ((ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
++src, ++dest;
if (ret < 0)
ret = -1;
if (ret>0)
ret = 1;
return ret;
}
strcat 【c语言|C语言中库函数的模拟实现】字符串追加
要求:
源字符串必须以“\0”结束
目标空间必须足够的大,能容纳下字符串的内容
目标空间必须可修改
char* my_strcat(char* dest, const char*src)
{
assert(dest&&src);
char* ret = dest;
//找到目标空间的“\0”
while (*dest)
{
++dest;
}
//追加
while ((*dest++) = (*src++))
{
;
}
return ret;
}
推荐阅读
- 千里之行始于足下|C语言strcmp库函数讲解
- c语言|(C语言)strstr库函数的简单使用以及模拟实现
- c语言|C语言-字符串库函数详解(含部分函数的模拟实现)
- 网络安全|测试攻击机伪装成目标机 IP 给目标机发送攻击报文是否成功
- lua|Redis Lua 沙盒逃逸漏洞(CVE-2022-0543)
- python|【python与pycharm安装教程,详解】
- Qt-大屏电子看板|Qt编写可视化大屏电子看板系统32-模块10大屏地图
- 程序人生|面试字节跳动,我被怼了。
- 嵌入式|网上五花八门的单片机教程,到底应该怎么整理学习过程