• strlen函数详解


    众所周知

    strlen()函数是用来计算长度的;

    一.函数原型

    size_t strlen( const char *string );
    
    • 1
    • 说明:计算字符串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 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    运行结果

    在这里插入图片描述

    二.注意事项

    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 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    输出结果如下

    在这里插入图片描述
    测试发现不仅,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 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    可以看到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 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    初始化之后的结果就正确了

    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 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 输出结果 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 ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    四. 总结
    • 字符串需要以\0作为结尾,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0)
    • 字符串记得初始化
    • 注意strlen返回的类型,size_t 无符号长整型
  • 相关阅读:
    测试的专用
    并发编程原理学习-reentrantlock源码分析
    关于正负数的取模并小议某度的流量生产思维
    2022.6.30-2022.7.3 Three.js 学习笔记
    JavaScript基础 事件处理一 事件处理方式和事件流(事件冒泡和事件捕获)
    看不懂执行计划还谈什么SQL优化
    C语言之指针、结构体、动态内存分配
    前端周刊:2022-13 期
    【DETR用于3D目标检测】3DETR: An End-to-End Transformer Model for 3D Object Detection
    ChatRule:基于知识图推理的大语言模型逻辑规则挖掘11.10
  • 原文地址:https://blog.csdn.net/weixin_44057803/article/details/127649050