目录
前言
一、模拟实现 strlen()
方法一:计数器方法
方法二:递归函数实现
方法三:指针-指针
二、模拟实现strcpy()
前言
int strlen(const char*)是计算字符串长度的函数,返回类型为int,在计算过程中,遇到‘ ’结束计算返回值;
char* strcpy(char* destination,const char* source)将字符串source中的字符全部拷贝到数组destination中去;
为了更准确使用这两个库函数,今天我们就来模拟实现,掌握背后的原理;
一、模拟实现 strlen()
引入头文件
#include
方法一:计数器方法
在函数内部设定一个计数器count,当满足条件时,count自加,当不满足条件时,返回count的值。
代码如下:
#include
int my_strlen(const char* str)
{
int count = 0;//count在此作为一个计数器,统计出现的字符;
while (*str)//循环条件为 当内容不为结束符‘ ’时循环
{
count++;
str++;//统计完成后 地址向后加一位;
}
return count;//循环结束后 返回计数器count的值
}
int main()
{
char str[] = "abcdef";
int len=my_strlen(str);
printf("%d", len);
return 0;
}
运行结果如下:
方法二:递归函数实现
代码如下:
#include
int my_strlen(const char* str)
{
if (*str == ' ')//当内容为结束符‘ '时 返回0
return 0;
else
return 1 + my_strlen(++str);//取本次地址的下一位作为下次函数数调用的参数
}
int main()
{
char str[] = "abcdef";
int len=my_strlen(str);
printf("%d", len);
return 0;
}
运行结果如下 :
方法三:指针-指针
指针-指针得到的是两指针之间的元素个数
代码如下:
#include
int my_strlen(const char* str)
{
char* tem = str;//设置一个临时指针变量记录此时地址
while (*tem)//利用指针tem,当内容不为结束符’ ‘时向后加一,直到退出
{
tem++;
}
return tem - str;//指针-指针=两地址间元素的个数就为字符数
}
int main()
{
char str[] = "abcdef";
int len=my_strlen(str);
printf("%d", len);
return 0;
}
运行结果如下:
二、模拟实现strcpy()
对于给定数组str1 现要把str1的内容全部拷贝到一个可变数组str2中
代码如下:
#include
char* my_strcpy(char* dest, const char* src)
{
while (*src)//条件判断是否为结束符’ ‘
{
*dest = *src;//将src的内容赋给dest
dest++;
src++;//两个地址自增
}
}
int main()
{
char str1[20] = "abcdef";
char str2[20] = { 0 };
my_strcpy(str2, str1);
puts(str2);
return 0;
}
运行结果如下:
对上述代码进行优化把条件-赋值-地址自增放在while的条件语句中
优化代码如下:
#include
char* my_strcpy(char* dest, const char* src)
{
while (*dest++ = *src++);
//由于自加的优先级高于取内容符号,所以先进行自加运算,又因为是后置++,所以先使用地址 同时把右边的scr的内容赋给
//dest,赋值完毕后,地址向后移一位,如果当dest赋给src的值为结束符时那么此循环结束;}
int main()
{
char str1[20] = "abcdef";
char str2[20] = { 0 };
my_strcpy(str2, str1);
puts(str2);
return 0;
}
运行结果如下: