1. strlen()
size_t strlen ( const char* str );
- 函数返回的是字符串不含
\0
的字符个数- 参数指向的字符串必须要以
\0
结束- 函数的返回类型是size_t,无符号整型,不是int
🍀strlen()返回不带’\0’的字符个数
char str[] = "abcde";
int num = strlen(str);
num的值是5。
其实str数组的组成是这样的。它有6个元素,最后一个元素'\0'
我们看不到,而strlen也不会计算这个'\0'
🍀参数指向的字符串必须以’\0’结束
不含'\0'
会出错的
🍀函数的返回类型是size_t,不是int
其中第三点是一个易错点。strlen返回的起始不是int
型,而是无符号整型unsigned long
,
在我的编译器中可以看到,这段程序可以运行起来,但是有报错,不能用%d
,而是%lu
![](https://i-blog.csdnimg.cn/blog_migrate/5f955f4f3dec19cbba9fad842424b2c3.png)
平常的应用中可能无伤大雅,但是我们来看这个例子
int main()
{
if(strlen("abc") - strlen("abcdef") > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
"abc"是3个字符,"abcdef"是6个字符,3-6 = -3,应该输出<=
然而实际上呢
)
因为strlen(“abc”)返回的是 无符号的3
strlen(“abcedf”)返回的是 无符号的6
最后的结果-3如果按照无符号数来算将是一个很大的数,else语句永远不会被执行
这里我们就要改进一下,进行强制类型转化才能得到想要的
![](https://i-blog.csdnimg.cn/blog_migrate/beb451f7e6b0ca5db818eedcab2a0726.png)
🍀模拟strlen()函数
🍎 非递归方法
size_t my_strlen(const char* str)
{
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
🍎 递归方法
size_t my_strlen(const char* str)
{
while(*str != '\0')
{
return my_strlen(str + 1) + 1;
}