strlen的实现:
作用:求字符串的长度,给定字符串后调用strlen函数可求出给定字符串的长度
实现机制:
1.在函数中定义一个临时变量,用于记录字符串的长度,当指针向后走一步,如果是非‘\0’则加1,最终返回临时变量则为长度。
2.不定义临时变量实现,用递归的思路,求一个字符串长度,例如:abcdef的长度就可以表示为1+bcdef的长度,bcdef的长度又可以表示为1+cdef的长度,依次分解为子问题直至遇到‘\0’就可以求得字符串的长度。
3.指针相减得到字符串的长度。刚开始时,两个指针都指向字符串的首元素,让一个指针向后移动,直至遇到’\0’,然后用后指针减去前指针即为字符串的长度。
非递归参考函数:
int my_strlen(const char* str)
{
assert(str != NULL); //断言判定不允许传空指针
int ret = 0;
while (*str != '\0')
{
++ret;
++str;
}
return ret;
}
递归参考函数:
//递归实现
int my_strlen(const char* str)
{
assert(str != NULL);
if (*str == '\0')
{
return 0;
}
return 1 + my_strlen(str+1);
}
指针相减参考函数:
//指针相减实现
int my_strlen(const char* str)
{
assert(str != NULL);
char* dest = str;
while (*dest != '\0')
{
dest++;
}
return dest - str;
}
参考代码如下:
#include <stdio.h>
#include <assert.h>
//
//指针相减实现
int my_strlen3(const char* str)
{
assert(str != NULL);
const char* dest = str;
while (*dest != '\0')
{
dest++;
}
return dest - str;
}
//递归实现
int my_strlen2(const char* str)
{
assert(str != NULL);
if (*str == '\0')
{
return 0;
}
return 1 + my_strlen2(str+1);
}
//非递归
int my_strlen1(const char* str)
{
assert(str != NULL); //断言判定不允许传空指针
int ret = 0;
while (*str != '\0')
{
++ret;
++str;
}
return ret;
}
int main()
{
char arr[100] = "abcdef";
printf("%d\n", my_strlen1(arr));
printf("%d\n", my_strlen2(arr));
printf("%d\n", my_strlen3(arr));
return 0;
}
运行结果展示:
其他字符串操作函数的实现:
------strcpy的实现
------strcat的实现
------strstr的实现
------strchr的实现
------strcmp的实现
------memcpy的实现