计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!

一,使用   递归   计算 字符串 的 长度

1,题目描述

2,分析题目

Ⅰ,题目中要求除了函数的形参,函数中不能够使用多余的变量(这是比较苛刻的要求)。

Ⅱ,根据此,很自然的想到需要使用递归来解决问题。

Ⅲ,字符串的结束标志是’\0′,因此可以将 读取到’\0′ 作为结束条件

3,关于递归的基本知识

Ⅰ,递归包含两个过程:
        递推的过程。

        回归的过程。

Ⅱ,递归的两个必要条件:

        ①:必须有限制条件来结束递推,否则会造成死递归,最终导致栈溢出(内存爆满)。

        ②:随着不断地递推,越来越接近限制条件

4,解决问题

如图所示:

假设输入 yes

红色部分的是递推的过程

绿色部分的是回归的过程

5,代码解决

在代码中具体分析问题

#define _CRT_SECURE_NO_WARNINGS 1
//写一个函数Strlen,可以求字符串长度,除了函数的形参,函数中不能使用多余的变量。
//输入一个字符串(字符串长度小于等于30,中间不包含空格),使用Strlen函数可以求字符串的长
//度,并返回。
//注:字符串的结束标志是\0,

//思路:
//递归:包含两个过程 1,递推的过程 , 2,回归的过程
//递归包含两个 必要 的条件:
//1,存在一个限制条件可以 使得递归结束,否则就会导致无限递归 ,最终导致 栈区溢出
//2,随着不断的递归 ,越来越接近 限制条件
#include<stdio.h>
#include<string.h>
#define LEN 100
int my_strlen(char* pstr)
{
	if (*pstr == '\0')
	{
		return 0;
	}
	else
	{
		return (1 + my_strlen(pstr + 1));//地址加 1,往后走
	}
}//求字符串的长度
int main()
{
	char str[LEN] = { 0 };
	//输入
	gets(str);

	//求字符串的长度
	int len = my_strlen(str);//数组传参传的是首元素的地址

	//打印
	printf("%d\n", len);


	return 0;
}

二,指针 减 指针  来计算字符串的长度

1,题目描述

2,分析题目

Ⅰ,字符串的结束标志是’\0’。

Ⅱ,记录 字符串中起始 字符的地址(start)地址 ++往后走,直到遇到 ‘\0‘截止此时的’\0’的地址  减去 起始字符的地址(start)  就是 字符串的长度。

3,解决问题

在代码中具体分析,如下:

#include<stdio.h>
//写一个函数Strlen,可以求字符串长度,除了函数的形参,函数中不能使用多余的变量。
//输入一个字符串(字符串长度小于等于30,中间不包含空格),使用Strlen函数可以求字符串的长
//度,并返回。
//注:字符串的结束标志是 \0

//思路:
//指针 减 指针
#define LEN 1000
#include<string.h>
int my_strlen(char* pstr)
{
	char* start = pstr;//首元素的地址
	while (*pstr)//当没有遇到 '\0' 的时候,地址 ++
	{
		pstr++;
	}
	return (pstr - start);//'\0'的地址 减去 数组中首元素的地址 就是字符串的长度
}
int main()
{
	char str[LEN] = { 0 };
	gets(str);//输入

	int len = my_strlen(str);//数组传参传的是数组中首元素的地址

	//打印
	printf("%d\n", len);

	return 0;
}

三,使用  计数器  来统计字符串的长度

1,题目描述

2,分析题目

Ⅰ,字符串的结束标志是’\0’。

Ⅱ,定义 计数器 cnt 来统计 字符串中字符的个数。

3,解决问题

在代码中具体分析,如下:

#define _CRT_SECURE_NO_WARNINGS 1
//写一个函数Strlen,可以求字符串长度,注:字符串的结束标志是\0
//输入一个字符串(字符串长度小于等于30,中间不包含空格),使用Strlen函数可以求字符串的长
//度,并返回。
#include<stdio.h>
//思路:
//1,字符串的结束标志是 '\0';
//2,遍历 所输入的字符串 遇到 '\0' 截至
#include<string.h>
int my_strlen(char* pstr)
{
	int cnt = 0;//计数器 //记录数组中的字符的个数
	while (*pstr)//当 没有指向 '\0'时 , cnt ++,pstr++;
	{
		cnt++;
		pstr++;
	}
	return cnt;
}
int main()
{
	char str[31] = { 0 };
	gets(str);//输入


	int ret = my_strlen(str);//数组传参传的是首元素的地址

	//打印
	printf("%d\n", ret);
	return 0;
}
//总结;'\0'是字符串结束的标志

总结:

1,递归  的过程 较为 抽象, 一定要通过来 画图 理解 。

2,画图将抽象的问题实例化,一定要坚持 画图

3,字符串在内存中是连续存放的。

4,指针的类型决定了在对指针解引用的时候访问几个字节。

5,欢迎分享,感谢阅读!

版权声明:本文为博主作者:NMBG22原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/nmbg11/article/details/135323070

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2024年1月16日
下一篇 2024年1月16日

相关推荐