C语言编程之三个方法实现strlen函数

 更新时间:2021年09月17日 14:19:44   作者:Booksort  
本篇文章是C语言编程篇,主要为大家介绍C语言编程中实现strlen函数的三个方法讲解,有需要的朋友可以借鉴参考下,希望可以有所帮助

strlen()函数是来源于库函数<string.h>
是用于计算字符串的长度,
且字符串需要以'\0'结尾
strlen()会计算'\0'前的字符个数。

根据MSDN的描述

size_t strlen(const char* string);
size_t==unsigned int;

返回-无符号整型。
现在提供三种方法实现strlen()

一、计数器法

我们是计算字符个数,可以设置一个变量,每找到一个字符,计数器就加一。

int my_strlen(const char* arr)//计数器的方法
{
	assert(arr);
	int count = 0;
	while (*arr)//条件是*arr!='\0',但'\0'也是数字0,且条件是0为假,非0为真
	{
		count++;
		arr++;
	}
	return count;
}
int main(void)
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("len = %d\n", len);
	return 0;
}

二、递归法

递归可以不创建变量去计算。
先看代码吧

int my_strlen(const char* p)//递归法
{
	while (*p)
	{
		p++;
		my_strlen(p);
		return 1+my_strlen(p);//此时p已经是进入循环的p+1;
	}
	return 0;
	
}
int main(void)
{
	char arr[] = "abcde";
	int len = my_strlen(arr);
	printf("len = %d\n", len);
	return 0;
}

传了arr数组名进去,用p来接收。同样的判断条件,进入循环内,指针向右移动了一个字节,得到下一个字符的地址,又进入函数,再次循环

举个例子
以字符串为ab为例

在这里插入图片描述

最后解引用得到‘\0',返回0。则上一级函数返回1+下一级函数的返回值(0),再返回上一级函数,且他的返回值是1+1+0。正好是2

三,指针减指针法

指针相减,得到的不是指针,而是两指针间的元素个数。

思路:我们找到首字符的指针,再找到‘\0'的指针,返回两指针相减的值。

看代码

int my_strlen(const char* p)//指针相减法
{
	char* ret = p;
	while (*p)
	{
		p++;
	}
	return p - ret;

}
int main(void)
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("len = %d\n", len);
}

因为p会不断移动,指针指向的地址会改变,所以要先将首地址赋给另一个不会变化的指针。

在这里插入图片描述

这张图就相当明显了。

代码都可以运行,所用编译器为VS2019,记得运行的时候加上头文件

以上就是C语言编程之三个方法实现strlen()的详细内容,更多关于C语言实现strlen()的资料请关注脚本之家其它相关文章!

相关文章

  • C语言运用函数的递归实现汉诺塔

    C语言运用函数的递归实现汉诺塔

    递归(recursive)函数是“自己调用自己”的函数,无论是采用直接或间接调用方式。间接递归意味着函数调用另一个函数(然后可能又调用第三个函数等),最后又调用第一个函数。因为函数不可以一直不停地调用自己,所以递归函数一定具备结束条件
    2022-07-07
  • C++11 Unicode编码转换

    C++11 Unicode编码转换

    这篇文章主要介绍了C++11 Unicode编码转换的相关资料,帮助大家更好的理解和学习c++11,感兴趣的朋友可以了解下
    2020-08-08
  • C++中for循环与while循环的区别总结

    C++中for循环与while循环的区别总结

    这篇文章主要给大家介绍了关于C++中for循环与while循环的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 通过C++程序示例理解设计模式中的外观模式

    通过C++程序示例理解设计模式中的外观模式

    这篇文章主要介绍了通过设计模式中的外观模式及相关的C++程序示例,外观模式在高层提供了一个统一的接口实现一定程度上的解耦,需要的朋友可以参考下
    2016-03-03
  • C语言 分析逆序字符串与字符串的逆序输出有什么区别

    C语言 分析逆序字符串与字符串的逆序输出有什么区别

    例如,给定一个字符串 s,将 s 中的字符顺序颠倒过来,如 s = “abcd”,逆序后变成 “dcba”。可以采用多种方法对字符串进行逆序,以下将对其中的方法和字符串的逆序输出的区别进行分析
    2022-04-04
  • 利用stream实现一个简单的http下载器

    利用stream实现一个简单的http下载器

    这篇文章主要介绍了利用stream实现一个简单的http下载器的相关资料,需要的朋友可以参考下
    2015-03-03
  • VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    VS2017+Qt5+Opencv3.4调用摄像头拍照并存储

    本文主要介绍了VS2017+Qt5+Opencv3.4调用摄像头拍照并存储,实现了视频,拍照,保存这三个功能。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++ 中回文数判断简单实例

    C++ 中回文数判断简单实例

    这篇文章主要介绍了C++ 中回文数判断简单实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • 基于C++实现的线程休眠代码

    基于C++实现的线程休眠代码

    这篇文章主要介绍了基于C++实现的线程休眠代码,包括了Linux平台及基于boost库的两种实现方法,有不错的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++非递归建立二叉树实例

    C++非递归建立二叉树实例

    这篇文章主要介绍了C++非递归建立二叉树的方法,实例分析了二叉树的原理与C++实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04

最新评论