众所周知
strlen()函数是用来计算长度的;
一.函数原型
size_t strlen( const char *string );
- 说明:计算字符串sting的长度,并返回字符串string的长度
- 返回类型:size_t 是一个无符号长整型类型,直接作为数值运算时得注意,计算结果是否会越界
- 举例
- #include "stdio.h"
- #include "string.h"
int main(void )
{
char str[30] = "good morning everybody" ; // 22个字符
printf(" str = %s strlen(str) = %d \n",str,strlen(str));
return 0 ;
}
运行结果
二.注意事项
2.1 strlen是不会计算\0之后的长度的
- strlen函数遇到\0就会停止下来
- 在上面字符串变量,赋值中加入一个 \0 测试一下
测试代码如下:
- #include "stdio.h"
- #include "string.h"
int main(void )
{
char str[30] = "good morning \0 everybody" ;
printf(" str = %s strlen(str) = %d \n",str,strlen(str));
return 0 ;
}
输出结果如下
测试发现不仅,strlen不计算 \0之后的数据,printf输出也一样,原因就回到数组的问题上了,printf是以%s,字符串的形式输出,遇到字符 ‘\0’ 就认为到达 数组末端了,然后就停止输出了。
2.2 定义字符串数组后,一定要初始化
- 未初始化的结果如下
定义一个字符数组变量,打印26个英文字母,并查看字符数据变量得实际长度,测试代码如下:
#include "stdio.h"
#include "string.h"
int main()
{
char test[50]; // 未初始化
int i = 0;
printf(" test[] = ");
for (; i < 26; i++) {
test[i] = 'A' + i;
printf(" %c ",test[i]);
}
printf("\n stelen(test) = %d \r\n",strlen(test));
return 0 ;
}
可以看到strlen计算出的结果是77,显示是错误的
原因:test字符串在定义时未初始化,test字符串在定义时,拿到一片内存,此时这片内存里面可能储存有值,导致使用strlen计算test字符串时找不到字符串结束标志 ’\0‘,而会在test申请的那片内存后面一直找下去,找到 ’\0‘ 后输出,计算的结果,此时输出的结果肯定错误的结果。
- 初始化的结果如下
#include "stdio.h"
#include "string.h"
int main()
{
char test[50] = {0}; // 初始化
int i = 0;
printf(" test[] = ");
for (; i < 26; i++) {
test[i] = 'A' + i;
printf(" %c ",test[i]);
}
printf("\n stelen(test) = %d \r\n",strlen(test));
return 0 ;
}
初始化之后的结果就正确了
2.3 stlen返回类型 size_t
- 先看面这个代码
#include "stdio.h"
#include "string.h"
int main()
{
char a[50] = "123456";
char b[50] = {"123"};
if( strlen(b) - strlen(a) > 0 ){
printf("字符串b 比 字符串a 长 \n");
}else{
printf("字符串a 比 字符串b 长 \n");
}
return 0 ;
}
- 输出结果 strlen(a) > strlen(b) ; strlen(a)的大小为6,strlen(b)的大小为3,那么为什么会出现strlen(ab-strlen(a)>0的结果呢?
- 原因在于,strlen函数的返回值类型是size_t类型,就是无符号的整数类型,无符号类型是大于等于0的,两个strlen的返回值类型都是size_t类型的,那么两个size_t类型的数字进行相减的结果同样也是size_t类型的,那么返回值的类型也就是size_t类型的了
三. 自己实现一个strlen函数
#include "stdio.h"
int myStrlen(const char* str)
{
int count = 0;
if (str == NULL) {
return -1;
}
while(*str != '\0') // 只要不为 结束字符
{
str++;
count++;
}
return count;
}
int main()
{
char a[50] = "123456";
char b[50] = {"123"};
printf(" myStrlen(a) = %d myStrlen(b) = %d \n\n", myStrlen(a), myStrlen(b));
if( myStrlen(b) - myStrlen(a) > 0 ){
printf("字符串b 比 字符串a 长 \n");
}else{
printf("字符串a 比 字符串b 长 \n");
}
return 0 ;
}
四. 总结
- 字符串需要以\0作为结尾,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0)
- 字符串记得初始化
- 注意strlen返回的类型,size_t 无符号长整型