strlen函数详解

1.函数原型

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.注意事项

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 strlen返回类型 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类型的了

3. 自己实现一个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 ;
}

在这里插入图片描述

4. 总结

  • 字符串需要以\0作为结尾,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0)
  • 字符串记得初始化
  • 注意strlen返回的类型,size_t 无符号长整型
  • 114
    点赞
  • 462
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值