一、模拟实现strlen
strlen可以计算字符串的长度,就是从字符串首元素开始,直到' \0 '
cpp
int my_strlen(char* str)
{
assert(str);
int count = 0;
while (*str)
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
法二:
cpp
//不创建临时变量
int my_strlen(char* str)
{
if (0 == *str)
{
return 0;
}
else
return 1 + my_strlen(str + 1);
}
法三:
cpp
//指针
int my_strlen(char* str)
{
char* p = str;
while (*str)
{
str++;
}
return str - p;
}
二、模拟实现strcpy
strcpy可以将想拷贝的字符串拷贝到指定地点
cpp
char* my_strcpy(char* dest, const char* scr)
{
assert(dest && scr);
char* ret = dest;
while (*dest++ = *scr++)
;
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[10] = { 0 };
my_strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
也可以这样用
cpp
my_strcpy(arr2, "我好帅");
printf("%s\n", arr2);
三、模拟实现strcat
strcat可以实现在字符串后面加上自己想要的字符,直到' \0 '
cpp
char* my_strcat(char* dst, char* scr)
{
assert(dst && scr);
char* ret = dst;
while (*dst)
dst++;
while (*dst++ = *scr++)
;
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "blog!";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
四、模拟实现strstr
strstr可以寻找字符串中的字符串
cpp
char* my_strstr(const char* dst, const char* scr)
{
char* s1 = (char*)dst;
char* s2 = (char*)scr;
char* ret = (char*)dst;
if (!*s2)
{
return ret;
}
while (*ret)
{
s1 = ret;
s2 = (char*)scr;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return ret;
}
ret++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbcde";
char arr2[] = "bbc";
char *ret = my_strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
五、模拟实现strcmp
strcmp可以实现两个字符串比较,若s1大于s2返回一个大于0的数字,反之返回小于0的数字,若s1=s2,返回0
cpp
int my_strcmp(const char* str1,const char*str2)
{
assert(str1 && str2);
while (*str1 && *str2 && *str1 == *str2)
{
str1++;
str2++;
}
if (!*str1 && !str2)
{
return 0;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "acbdf";
int ret = my_strcmp(arr1,arr2);
printf("%d\n", ret);
return 0;
}
六、模拟实现memcpy
memcpy和strcpy类似,只是strcpy只可以拷贝字符串的,而memcpy可以拷贝其他你想要的类型
cpp
void* my_memcpy(void* dst, void* scr, int sz)
{
void* ret = dst;
while(sz)
{
*(char*)dst = *(char*)scr;
dst = (char*)dst + 1;
scr = (char*)scr + 1;
sz--;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1,sizeof(arr1));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
return 0;
}
七、模拟实现memmove
前面写的memcpy有点小瑕疵,当我想把数组arr1中的12345拷贝到数组arr1的34567上就会出现问题
原因是要拷贝3的时候,3已经被前面的1覆盖了,memmove就可以实现拷贝时重叠的问题
cpp
void* my_memmove(void* dst, void* scr, int sz)
{
assert(dst && scr);
void* ret = dst;
if (*(char*)dst > *(char*)scr)
{
while (sz+1)
{
*((char*)dst + sz) = *((char*)scr + sz);
sz--;
}
return ret;
}
else
{
while (sz)
{
*(char*)dst = *(char*)scr;
dst = (char*)dst + 1;
scr = (char*)scr + 1;
sz--;
}
return ret;
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memmove(arr1+2, arr1,20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
分类解决一下就好啦~
C语言中还有许多好用的库函数,合理运用可以使我们的代码学习事半功倍,模拟实现库函数也是和前辈大佬们对话的过程
都看到这里啦,就浅浅三连一下啦!QAQ