网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1.strlen函数的模拟实现
strlen函数的作用是求字符串的长度
strlen的函数原型
常规方法
找 ‘\0’ ,将字符串首地址传递过来,解引用后的值不是‘\0’的话,指针位置就后移,同时计数器count加1,知道指针解引用后的值为‘\0’,循环停止,函数返回计数器count的值
size_t my_strlen(char* str)
{
size_t count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char str[1000] = "I have a my_strlen hanshu";
size_t len = my_strlen(str);
printf("%zu", len);
return 0;
}
指针减指针
将字符串首元素地址传过来之后,先用字符指针保存,再将保存的指针移动,找‘\0’,找到‘\0’后,用这个位置的指针减去字符串首元素地址即为字符串长度
指针减去指针得到的值为两指针之间的元素个数
size_t my_strlen(char* str)
{
char* str2 = str;
while (*str2 != '\0')
str2++;
return str2 - str;
}
int main()
{
char str[1000] = "I have a my_strlen hanshu";
size_t len = my_strlen(str);
printf("%zu", len);
return 0;
}
递归
递归方法的核心就是大事化小
但要注意递归必须有条件,并且每次递归都要越来越接近这个条件
当传递过来的指针解引用为‘\0’时,说明递归结束,否则就指针后移继续递归
size_t my_strlen(char* str)
{
if (*str == '\0')
return 0;
else
return my_strlen(str + 1) + 1;
}
int main()
{
char str[1000] = "I have a my_strlen hanshu";
size_t len = my_strlen(str);
printf("%zu", len);
return 0;
}
2.strcpy函数的模拟实现
strcpy函数的作用是拷贝字符串
strcpy的函数原型
注意事项:
- 拷贝字符串,必须将 ‘\0’ 也拷贝过去
- 目表字符串必须是可变的,不能是常量字符串
- 函数要返回目标字符串的首地址,所以要先将首地址存起来
#include<assert.h>
char* my_strcpy(char* str1, const char* str2)
{
assert(str1 && str2);
char* ret = str1;
while (*str2 != '\0')
{
*str1 = *str2;
str1++;
str2++;
}
*str1 = *str2;
return str1;
}
int main()
{
char str1[100] = { "0" };
char str2[100] = "my_strcpy hanshu";
my_strcpy(str1, str2);
return 0;
}
3.strcmp函数的模拟实现
strcmp函数的作用是字符串比较
strcmp函数原型
注意事项:
当str1>str2时返回一个大于0的数,str1<str2时返回一个小于0的数,str1=str2时返回0,所以模拟实现时,当str1!=str2时,可以用 *str1-*str2 来表示返回值
//实现strcmp函数
#incldue<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 && *str2)
{
if (*str2 == *str1)
{
str1++;
str2++;
}
else
return *str1 - *str2;
}
if (*str1 == *str2 && *str1 == '\0')
return 0;
}
int main()
{
char str1[100] = "abcdefg";
char str2[100] = "abcdefr";
if (my_strcmp(str1, str2) > 0)
printf("str1>str2\n");
else
printf("str2>str1\n");
return 0;
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!