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()的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言入门篇--sizeof与strlen基础理论

    1.sizeof (1)若求字符串占据 空间 的大小,包括字符串结尾处默认的'\0'. (2)若所求不是字符串的大小,求的是数组.类型等的大小,不用考虑'\0',因为不是字符串,在结尾处无默认的'\0'. (3)若明显出现'\0',则统计. (4)返回一个变量或者类型的大小(以字节为单位) 2.strlen 求字符串内容的大小,统计字符串的字符个数,遇到'\0'停止统计,不统计'\0'. 3.知识点 3.1 对于数组 sizeof:结果就是数组大小. strlen:在计算时会遍历整个数组,往后遍

  • C语言中sizeof()与strlen()的区别详解

    前言 sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别: sizeof() 1. sizeof()[操作数所占空间的字节数大小]是一种c中的基本运算符. 可以以类型.指针.数组和函数等作为参数. 头文件类型为unsigned int. 运算值在编译的时候就出结果,所以可以用来定义数组维数. char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3 sizeof()是一种单目操作符,是用来计算你所使用

  • 浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char *strSrc) { char *res=strDest; assert((strDest!=NULL)&&(strSrc!=NULL)); while(*strDest)strDest++; while(*strDest=*strSrc) { strDest++; strSrc

  • C语言strlen和sizeof在数组中的使用详解

    目录 一.前言 二.sizeof在二维数组的试题 解读: 题解: 答案验证: 64位平台下: 32位平台下: 一.前言 前面我们详细讲了sizeof和strlen中的使用,基本涉及了所有一维数组可以和常见的题目类型 那么现在我们就将一维数组告一段落了,现在我们来开始讲解在二维数组的使用了,本篇是 sizeof和strlen的最后一篇了. 二.sizeof在二维数组的试题 #include<stdio.h> int main() { int a[3][4] = { 0 }; printf(&qu

  • C语言中sizeof()与strlen()函数的使用入门及对比

    sizeof()函数 1,是什么?     sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换.虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是两码事. 2,有什么用?     sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位. 3,怎么用?     sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量的存储空间.当对变量用的时

  • 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)//计

  • R语言行筛选的方法之filter函数详解

    目录 1. 数据 2. 生成ID列和类型 3. 提取effect大于0.1的行 4. 提取加性效应,且effect小于0的行 5. 根据部分行名删选 6. 固定字符特征进行行筛选 总结 下面介绍一下R语言中行筛选的方法,主要介绍filter函数 1. 数据 这里,使用asreml分析中的BLUP值为例,相关的模型为: m1 = asreml(Phen ~ G , random = ~ vm(Progeny,ainv) + vm(Dam,ainv) + vm(Progeny,dinv), work

  • Go语言编程通过dwarf获取内联函数

    目录 dwarf组成 如何将 addr 转换为行号 内联函数 如何展开内联函数 使用 parca 展开内联函数 parca 输出有以下问题 dwarf组成 dwarf 由 The Debugging Information Entry . type Entry struct { Offset Offset Tag Tag // 描述其类型 Children bool Field []Field // 包含的字段 } 不同的 entry 有不同的类型: tag compile unit, 在 go

  • 详解易语言编程原理和方法

    这里教大家怎么使用易语言进行编程. 第一步打开易语言 第二步选择"windows窗口",然后点确定,就可以进行编程了.看下图 打开之后的界面. 拖拽红色边框的组件到windows窗口上,图一跟图二.组件分别是编辑框跟按钮. 双击按钮组件,进入写程序界面.看到下图已经写好了的.提示:这里补充一下<编辑框1.内容=""--这里的""可以填写你自己的语句,下图我没填写,不好意思>. 然后点击运行. 可以看到了程序,接下来点击按钮,就可以看到

  • 混合语言编程—C#使用原生的Directx和OpenGL绘图的方法

    由于项目需要做一些图形展示,所以就想到了使用Directx和OpenGL来绘图,但项目准备使用C#来开发(大家比较熟悉C#),在网上看了相关的资料,有一些第三方的控件可用,试用了下,一运行就占了几百M的内存,而且也不知道是否稳定,教程也少,还不如直接使用原生的.在网上看的Directx和OpenGL的教程基本上都是C/C++的,找了很久也就找到相关介绍,只能自己研究下. 我以前做过C#和C++混合语言编程相关的东西,在C++实现一些C#不好实现的功能,C#动态调用DLL文件,所以也想到了用C++

  • C语言编程C++旋转字符操作串示例详解

    目录 旋转字符串 字符串左旋 题前认知: 暴力移位: 三步翻转: 判断字符串旋转 题前认知 字符串追加判断 旋转字符串 字符串左旋 实现一个函数,可以左旋字符串中的k个字符. 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 题前认知: 一个字符串如果就定死了.eg:char arr[]="dfdf"什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服) 所以字符串得是我们可输入的,才有可玩性,玩的不

  • C语言编程中常见的五种错误及对应解决方案

    目录 1. 未初始化的变量 2. 数组越界 3. 字符串溢出 4. 重复释放内存 5. 使用无效的文件指针 前言: C 语言有时名声不太好,因为它不像近期的编程语言(比如 Rust)那样具有内存安全性.但是通过额外的代码,一些最常见和严重的 C 语言错误是可以避免的. 即使是最好的程序员也无法完全避免错误.这些错误可能会引入安全漏洞.导致程序崩溃或产生意外操作,具体影响要取决于程序的运行逻辑. 下文讲解了可能影响应用程序的五个错误以及避免它们的方法: 1. 未初始化的变量 程序启动时,系统会为其

  • C语言编程入门必背的示例代码整理大全

    目录 一.C语言必背代码前言 二.一部分C语言必背代码 一.C语言必背代码前言 对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已.你所看到的那些几千甚至上万行的代码,都是用这些语句和关键词来重复编写的.只是他们逻辑功能不一样,那如何快速的上手C语言代码,建议多看多写,下面是小编整理的C语言必背代码. 二.一部分C语言必背代码 1.输出9*9成法口诀,共9行9列,i控制行,j控制列. #include "stdio.h" main() {int i,j,resul

  • 提高PHP编程效率的方法

    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row['id'] 的速度是$row[id]的7倍.3.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2.4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替.5.注销那些不用的变量尤其是大数组,以便释放内存.6.尽量避免使用__get,__set,__autoload.7

  • Go语言编程入门超级指南

    1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny. First you hate 'em,

随机推荐