方法一:count计数器
#include<stdio.h>
#include<stdlib.h>
int my_strlen(const char*str) //const修饰只读变量,防止变量被改
{
int count = 0;
while (*str++)//当*str ='\0'跳出循环,注意*str++ 操作符++优先级高于*操作符
{ //*str++改的是指针str,与const修饰str不冲突
count++;
}
return count;
}
int main()
{
char*p = "abcd\0ascd";//遇到'\0'停止计数
printf("%d",my_strlen(p));//输出结果为4
system("pause");
return 0;
}
const修饰指针变量
const char*p、char const*p (保护*p,指针p所指内容不可改)
char*const p(保护p,指针本身不可改,指针指向内容可通过指针被改变)
方法二:通过指针求解
指向同空间的指针相减等于指针间元素个数
#include<stdio.h>
#include<stdlib.h>
int my_strlen(const char*str)
{
char*p = str;
while (*++p) while (*p) while (*p++) //注意3者的写法
{ { {
; p++; ;
} } }
return p - str; return p - str; return p - str-1;
}
int main()
{
char*p = "abcd0ascd"; //其中字符0不同于'\0',不会停止计数
printf("%d",my_strlen(p));//输出结果为9
system("pause");
return 0;
}
方法三:通过递归的方法求解
#include<stdio.h>
#include<stdlib.h>
int my_strlen(const char*str)
{
if(*str=='\0')
{
return 0;
}
return 1+my_strlen(str+1); //函数递归
//等价于return 1+ my_strlen(++str);
//但不能写为1+ my_strlen(str++);后置加加每次调用不会改变str的值
}
int main()
{
char*p = "a\012d0a\x010"; //\012转义字符(\ddd)\x010转义字符(\xddd)
printf("%d", my_strlen(p)); // 输出结果为6
system("pause");
return 0;
}