前言:
1 头文件包含:#include <string.h>
2 函数原型: size_t strlen(const char *s);
3 功能:指定计算字符串s的长度,不包含字符串结束符’\0’
4 参数: s:字符串首地址
5 返回值: 字符串s的长度,size_t为unsigned int 类型
- 易错代码一
#include <stdio.h>
#include <string.h>
int main()
{
char str[]="abc\0defg";
int n = strlen(str); //n = 3
printf("n = %u\n",n);
return 0;
程序运行结果:
结果分析:
不懂strlen函数的人会误以为会输出:n = 8。
由于strlen函数内部是使用循环来计算字符串的长度的,而循环结束的条件就是遇到字符串的结束符’\0’。所以在字符串中插入’\0’后,输出字符串的长度会以第一个’\0’前面的字符个数为准。
- 易错代码二
#include <stdio.h>
#include <string.h>
int main(void)
{
char arr[] = {'a','b','c','d'};
printf("%u\n",strlen(arr));
return 0;
}
程序运行结果:
结果分析:
输出的字符串的长度是6,但这个6是一个随机值。因为strlen函数是计算字符串的长度的,而char arr[] = {‘a’,‘b’,‘c’,‘d’}是一个字符数组,它与字符串区别在于它没有’\0’;所以strlen函数会从字符a的地址开始循环累加字符串的长度直至遇到’\0’,这个结果值是随机的,因为你不知道字符数组后面的元素是什么。
- 易错代码三
#include <stdio.h>
#include <string.h>
int main(void)
{
char arr[5] = {'a','b','c','d'};
printf("%u\n",strlen(arr));
return 0;
}
程序运行结果:
结果分析:
这题和上题差不多,只是人为的规定了数组元素的个数为。故在定义数组时进行了部分初始化,部分初始化时,没有被赋值的元素系统自动赋值为0,所以数组中的arr[4]的值就是’\0’。这样数组里面存放的就是一个字符串。
4 易错代码四
#include <stdio.h>
#include <string.h>
int main()
{
if(strlen("abc") - strlen("abcdef") > 0)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
程序运行结果:
结果分析:
程序输出:hehe,代表了strlen(“abc”)-strlen(“abcdef”)>0的结果为真。原因是strlen的返回值是无符号类型,两个无符号数相减还是无符号数,无符号数是不存在负数的。