C语言strlen函数全方位讲解

 更新时间:2022年09月20日 10:15:52   作者:白朝槿kk  
在C语言中我们要获取字符串的长度,可以使用strlen函数,strlen函数计算字符串的长度时,直到空结束字符,但不包括空结束字符,因为 strlen函数时不包含最后的结束字符的,因此一般使用strlen函数计算的字符串的长度会比使用sizeof计算的字符串的字节数要小

strlen函数的讲解

strlen函数我们应该不陌生,它可以帮助我们求字符串的长度(不包括’\0’),但里面还有一些细节需要我们注意。看一下下面这张图:

strlen函数的头文件是<string.h>.如果要使用strlen这个函数,别忘记引头文件。

字符串是以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数。以下是用strlen函数时可能会遇到的几种问题,先看代码:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "qwer";
	char arr2[] = { 'q','w','e','r' };
	char arr3[] = { 'q','w','e','r','\0'};
	char arr4[10]= { 'q','w','e','r' };
	printf("arr1:%d\n", strlen(arr1));
	printf("arr2:%d\n", strlen(arr2));
	printf("arr2:%d\n", strlen(arr3));
	printf("arr2:%d\n", strlen(arr4));
	return 0;
}

以上代码输出的结果是什么?大家可以先试着算一下。然后再看运行结果。

运行结果如图所示,arr1初始化的时候存放的是字符串,字符串的是以’\0’ 为结束标志的,所以arr1的大小为4。这个应该问题不大。

重点说一下下面这几个。

arr2:我在初始化arr2的时候,是对arr2是以字符进行初始化的,但是我没有设置arr的大小,所以编译器是不知道arr2的大小的,后面存放的是什么东西也是不知道的,但是strlen它是找’\0’的,并返回’\0’之前字符的个数。所以

在strlen找到’\0’之前,前面有36个字符。

arr3:arr3与arr2不同的是,但是我在最后输入了’\0’进行初始化,所以arr3很简单的就找到了’\0’,并返回4。

arr4:arr4与arr2不同的是:我这次设置了arr4的大小,然后我用字符对arr4进行了初始化,虽然是用字符进行的部分初始化,但是编译器会帮我把没初始化的地方默认初始化为0,‘\0’的ASCII码值就是0,C语言字符在内存的形式就是ASCII码值,所以后面没初始化的地方存放的都是’\0’。

我们再来看一个东西,由上面的图,我们还可以知道strlen的返回值是size_t,这是一个无符号数。如果不清楚这个地方,我们也可能会在使用strlen的时候出现一些问题。看一下下面的代码:

#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("abc") - strlen("qwer") < 0)
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

对于上面的代码的运行结果是什么?

按常理来说,前面的字符串大小为3,后面的为4,比4小应该会打印1。我们来看运行结果:

它的运行结果是0,难道前面的字符串大小比后面的大吗,其实不是。关键在于它的返回值是一个无符号数。无符号数只有正数,没有负数。3-4=-1,但是此时的-1并不是有符号数,而是一个无符号数,那么-1此时就是一个很大的正数。所以此时才会输出0

如果要解决这个问题,有以下两种解决方案:

方法1:不相减,进行比较:

#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("abc") < strlen("qwer"))
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

方法2:强制类型转换

#include<stdio.h>
#include<string.h>
int main()
{
	if ((int)strlen("abc") -(int)strlen("qwer") < 0)
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

说一下方法1,无符号数只有正数,没有负数,直接计算大小(正数)就可以直接比较了。方法2是强制转换为int类型的数据,整型是有符号数,有符号数就可以进行相减,结果为-1,就是-1。两种结果输出结果都是1.

strlen函数的模拟实现

讲完了strlen函要注意的问题,下面讲一下strlen函数的模拟实现。总共有三种方法:计数器方式,递归的方式和指针-指针的方式。

计数器方式

实现的思想:设置一个计数的变量,让一个字符指针遍历字符数组的每一个元素,如果指针指向的元素不是’\0’,计算器就自增,直到指针指向的元素是’\0’,就停止遍历,并返回计数器。

因为是模拟实现,我们就只求一致,返回值就设置为size_t。

实现代码如下:

#include<stdio.h>
#include<string.h>
#include<assert.h>
size_t my_strlen(const char* p)
{
	int count = 0;
	assert(p != NULL);//如果等于空指针就会报错
	while((*p) != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "CSDN";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

递归的方式

代码实现的思想:这种方式是不用创建临时变量的一种方法, 只使用指针进行遍历,如果指针指向的不是’\0’,那么就返回1和指针指向后一个数据的结果。

size_t my_strlen(const char* p)
{
	if ((*p) == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(p+1);
	}
}
int main()
{
	char arr[] = "CSDN";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

指针减指针的方式

代码实现的思想:

元素名是首元素的地址,我们就在定义一个指针,指向这个数组,让这个指针进行遍历,指向的不是’\0’就让指针进行自增。最后让遍历完数组的指针减去数组名(也就是首元素的地址)。

注意:当两个指着指向同一块空间时,指针减指针的绝对值就是两个指针之间的元素个数,而不是 个数*数据类型所占的空间。

size_t my_strlen(const char* p)
{
	char* s = p;
	while((*s) != '\0')
	{
		s++;
	}
	return s - p;
}
int main()
{
	char arr[] = "CSDN";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

到此这篇关于C语言strlen函数全方位讲解的文章就介绍到这了,更多相关C语言strlen函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(13.罗马数字转化成整数)

    C++实现LeetCode(13.罗马数字转化成整数)

    这篇文章主要介绍了C++实现LeetCode(13.罗马数字转化成整数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ 中的Swap函数写法汇总

    C++ 中的Swap函数写法汇总

    这篇文章主要介绍了C++ 中的Swap函数写法汇总,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C++课程设计之学生成绩管理系统

    C++课程设计之学生成绩管理系统

    这篇文章主要为大家详细介绍了C++课程设计之学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++类中的常数据成员与静态数据成员之间的区别

    C++类中的常数据成员与静态数据成员之间的区别

    常数据成员是指在类中定义的不能修改其值的一些数据成员,类似于我们以前学过的常变量,虽然是变量,也有自己的地址,但是一经赋初值,便不能再被修改
    2013-10-10
  • 原创的C语言控制台小游戏

    原创的C语言控制台小游戏

    本文给大家分享的是个人原创设计的一个C语言控制台小游戏,非常的简单,但是挺好玩的,推荐给大家,有需要的小伙伴也可以自由扩展下。
    2015-03-03
  • C/C++实现string和int相互转换的常用方法总结

    C/C++实现string和int相互转换的常用方法总结

    在C++编程中,经常需要在字符串(string)和整型(int)之间进行转换,本文将详细介绍几种在C和C++中实现这两种类型转换的常用方法,有需要的可以参考下
    2024-01-01
  • C语言中计算函数执行时间的三种方式

    C语言中计算函数执行时间的三种方式

    本文主要介绍了C语言中计算函数执行时间的三种方式,主要包括clock(),timeb和time,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C++ 结合 opencv读取图片与视频的方法

    C++ 结合 opencv读取图片与视频的方法

    这篇文章主要介绍了C++ 结合 opencv读取图片与视频,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 基于C++制作一个简单的跑酷游戏

    基于C++制作一个简单的跑酷游戏

    这篇文章主要为大家详细介绍了如何利用C++制作一个简单的跑酷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-06-06
  • 漫画讲解C语言中最近公共祖先的三种类型

    漫画讲解C语言中最近公共祖先的三种类型

    这篇文章主要总结了使用C语言查找最近公共祖先的三种方法类型,用漫画的方式讲解原理定义,看上去更生动形象,帮助你更好的理解透彻,快来跟着本文往下看吧
    2021-11-11

最新评论