在模拟实现strlen之前,我们先来了解一下strlen如何使用。
strlen实现的功能是统计一个字符串的长度。接受字符串的首元素的地址,统计到\0结束。返回size_t类型的一个无符号整型的数字。
使用的时候有几点需要注意的地方:
①由于c语言中没有字符串这一类型的定义,因此对于字符数组进行统计。
1 对于
char arr[]={"abcde"};
末尾自带了一个‘\0’,可以正常统计长度。
2 对于
char arr[]={'a','b','c','d','e'};
没有\0因此统计的时候会出现随机值。
3 对于
char arr[10]={'a','b','c','d','e'};
则会自动补上'\0',那么此时使用strlen也能正确的统计出对应的数据。
让我们使用strlen来了解一下。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10] = { "abcde" };//5
char arr2[] = { 'a','b','c','d','e' };//随机值
char arr3[10] = { 'a','b','c','d','e' ,'\0' };//5
printf("%d ", (int)strlen(arr1));
printf("%d ", (int)strlen(arr2));
printf("%d ", (int)strlen(arr3));
return 0;
}
对strlen有了一个基本的了解,那么让我们模拟实现一下strlen吧。
方法一:用count计数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr1)//为了防止传址调用的时候原字符串被修改 因此加上const对他进行限制
{
assert(arr1 != NULL);//传入的地址不能是空指针
unsigned int count = 0;
while (*arr1 != '\0')
{
count++;
arr1++;//一个位置一个位置进行统计,统计完成之后就++跳到下一个地址。
}
return count;
}
int main()
{
char arr[] = { "abcde" };
printf("%d ", (int)my_strlen(arr));
return 0;
}
方法二:函数的递归
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr1)
{
assert(arr1 != NULL);
unsigned int count = 0;
if (*arr1 != '\0')
{
return 1 + my_strlen(arr1 + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = { "abcde" };
printf("%d ", (int)my_strlen(arr));
return 0;
}
方法三:地址减去地址(统计元素个数)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen( const char* arr1)
{
assert(arr1 != NULL);
const char* start = arr1;//记录首元素的地址
while (*arr1!='\0')
{
arr1++;
}
return arr1 - start;
}
int main()
{
char arr[] = { "abcde" };
printf("%d ",(int) my_strlen(arr));
return 0;
}