计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | 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,欢迎分享,感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315503.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红光护理加按摩放松,试试用清洁仪改善头皮健康

头皮健康和脱发问题现在越来越常见了&#xff0c;所以平时注意改善头皮健康特别重要。这些天我正在用一款名为DOCO红光头皮清洁仪&#xff0c;据说它可以通过多种方式改善头皮健康&#xff0c;我感觉效果还可以。 这款红光头皮清洁仪具有高频振动清洁功能&#xff0c;每分钟可以…

MATLAB习题操作实战

2.1创建一个有7个元素的一维数组&#xff0c;并做如下处理:直接寻访一维数组的第6个元素;寻访一维数组的第1、3、5个元素;寻访一维数组中第4个至最后1个元素;寻访一维数组中大于70的元素。 % 创建一维数组 array [50, 60, 70, 80, 90, 100, 110];% 直接寻访一维数组的第6个元…

55寸oled透明显示屏售价,受哪些因素影响

55寸OLED透明显示屏的售价受到多个因素的影响&#xff0c;包括以下几个方面&#xff1a; 尺寸和分辨率&#xff1a;OLED透明显示屏的尺寸和分辨率是决定价格的重要因素。较大的尺寸和较高的分辨率会增加制造成本和售价。 技术水平和制造工艺&#xff1a;OLED透明显示屏的技术水…

GRU算法

前置知识&#xff1a;RNN&#xff0c;LSTM LSTM需要训练的参数很多&#xff0c;极消耗计算资源。GRU是一种LSTM的改进算法&#xff0c;参数更少&#xff0c;更容易训练。 它将忘记门和输入门合并成为一个单一的更新门&#xff0c;同时合并了数据单元状态和隐藏状态&#xff0…

WPF容器的背景对鼠标事件的影响

背景&#xff1a;在实现鼠标拖动窗口的过程中发现对父容器设置了鼠标拖动窗口的事件MouseLeftButtonDown private void DragWindow(object sender, MouseButtonEventArgs e) {if (e.LeftButton MouseButtonState.Pressed)DragMove(); } 问题&#xff1a;非常困惑的是&#x…

开发辅助三(缓存Redisson分布式锁+分页插件)

缓存 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;由于缓存不命中&#xff0c;将大量查询数据库&#xff0c;但是数据库也没有此记录。 没有将这次查询的null写入缓存&#xff0c;导致了这个不存在的数据每次请求都要到存储层查询&#xff0c;失去了缓存的意义。 解…

机器学习(二) -- 数据预处理(1)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 一、概述…

普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯)

简介 实现PWM呼吸灯。 主芯片 STM32F103ZET6呼吸灯引脚 : PC7电路原理图 LED8 电路图 LED8 与 主芯片连接图 其他知识 公式 PWM周期公式: Tpwm ( (ARR 1) * (PSC 1) ) / Tclk Tclk为定时器的输入时钟频率 Tout则为定时器溢出时间 ARR为计数周期 PSC为预分频器的值…

数据结构OJ实验14-哈希查找

A. DS哈希查找—线性探测再散列 题目描述 定义哈希函数为H(key) key%11&#xff0c;输入表长&#xff08;大于、等于11&#xff09;。输入关键字集合&#xff0c;用线性探测再散列构建哈希表&#xff0c;并查找给定关键字。 输入 测试次数t 每组测试数据为&#xff1a; …

Python序列之字典

系列文章目录 Python序列之列表Python序列之元组Python序列之字典&#xff08;本篇文章&#xff09;Python序列之集合 Python序列之字典 系列文章目录前言一、字典是什么&#xff1f;二、字典的操作1.创建&#xff08;1&#xff09;通过{}、dict()创建&#xff08;2&#xff0…

Django HttpResponse 响应对象

目录 一、概述二、测试三、属性和方法四、解读 request 参数 一、概述 所谓 HttpRequest 响应就是服务器返回给客户端的数据&#xff0c;HttpRequest 由程序员自己创建&#xff0c;一般他们通过两种方式来创建。 不使用模板&#xff0c;直接调用 HttpResponse()&#xff0c;返…

安装 Node.js、npm

安装 nodejs 安装Node.js的最简单的方法是通过软件包管理器。 Node.js官网&#xff1a;https://nodejs.org/en/download/ cd /usr/local/src/wget -c https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz xz -d node-v18.16.0-linux-x64.tar.xz tar -xf node…