当前位置: 首页 > news >正文

字符串函数(2)

目录

  • 前言
  • 1. strlen
    • 1.1 strlen函数的理解和使用
    • 1.2 strlen函数的模拟实现
  • 2. strcpy
    • 2.1 strcpy函数的理解和使用
    • 2.2 strcpy函数的模拟实现
  • 3.strcat
    • 3.1 strcat函数的理解和使用
    • 3.2 strcat 函数的模拟实现

前言

在上一篇文章中,我们对字符分类函数和字符转换函数进行了学习,部分小伙伴们可能会想字符串函数在哪里呢?其实是我没有写完啦!在本篇文章中,我会对该内容进行详细讲解。
在这里插入图片描述

1. strlen

1.1 strlen函数的理解和使用

字符串函数的使用需要包含头文件string.h。strlen的返回值的类型是size_t(无符号整型)。strlen函数是求字符串的长度的。
例如:
在这里插入图片描述

工作原理是:
当我们有一个字符串时,里面除了我们没看到的以外,还存放着\0。我们给strlen函数传了数组名arr。数组名是数组首元素的地址,strlen从给定的起始位置开始,向后统计\0之前字符的个数。
注意:
一定是从起始位置开始,我们现在可以测试一下别的写法。
在这里插入图片描述
arr是数组名,代表首元素的地址,如果传arr,则从a开始数。如果传arr+1,则跳过一个元素,从b开始数。
前面我们说过strlen的返回值的类型是size_t类型的,这一部分我们需要加深理解,现在我们举一个例子进行理解。
在这里插入图片描述
按照我们的想法来看,strlen(arr2)和strlen(arr1)的输出结果分别为3和6,3减6的值等于-3,应该打印<=。但是运行的结果并不是我们所想,因为strlen的返回值的类型是size_t , size_t类型的值相减也是size_t,此时计算出的-3会被作为一个无符号的整型来处理,此时的-3就没有了符号位。
在这里插入图片描述
在内存中存放着-3的补码,当-3为无符号整型时,最前面的1就不是符号位了,此时就不存在原反补了。计算的结果将是一个非常大的正数,所以输出的结果是>。我们现在对代码进行修改。

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abc";if (strlen(arr2) > strlen(arr1) )printf(">\n");elseprintf("<=\n");return 0;
}

或者:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abc";if ((int)strlen(arr2) - (int)strlen(arr1) > 0)printf(">\n");elseprintf("<=\n");return 0;
}

这两个代码都能实现我们原来的目的。

1.2 strlen函数的模拟实现

我们采用递归的方式进行实现。
现在我们有一个字符数组里面存放着abcdef。现在我们需要写一个自己的函数来计算字符串的长度。仿照着strlen把arr传过去,并让其返回一个size_t的值,当然int也行,只是字符串的长度不会为负值,选择size_t比较合适。
函数的参数部分需要接受arr(即首元素的地址),我们采用char*类型的str进行接收,同时我们不希望str去改变字符串,使用可以使用const来修饰。
递归的思想是大化小,我们把字符串中的第一个字符拿出来,不是\0说明长度至少是1,1加上后面的长度就是总长度,按照这个原理我们不断的向后拿取,如图
在这里插入图片描述
代码:

#include<stdio.h>
size_t my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}int main()
{char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

运行结果:
在这里插入图片描述

现在可能还有部分小伙伴没有理解,我们可以缩短字符串的长度(改为abc)来理解:
在这里插入图片描述

我们要计算abc的长度,此处我们调用了自己写的函数来完成。我们将a的地址传了过去,给了str,此时str向后就可以看到a b c \0。
刚开始时,* sr 为a,a并不等于\0,我们就走else这条路,然后再对my_strlen进行调用。第二次调用时,这里的str指向b,b不等于\0,走else的路线,这里我们还需要对my_strlen进行调用,第三次调用时,这里的str指向c,c不等于\0,走else的路线,最后一次调用my_strlen时,str指向了\0。此时我们的递推就结束了,将开始回归。1就会不断的相加到3,最后返回去,此时len就为3.
注意:
在这里的 1 + my_strlen(str + 1)没有返回时,是不会计算的。
代码:

#include<stdio.h>
size_t my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}int main()
{char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

2. strcpy

2.1 strcpy函数的理解和使用

该函数是用来进行字符串拷贝的。我们现在来看函数的基本情况。
在这里插入图片描述
第一个参数的名字是destination(目的地)。第二个参数是source(源头),即将源头的数据拷贝到destination里面去。例如:
在这里插入图片描述
理解:
arr1数组里面放了hello world\0 .我们把arr1和arr2分别传给了我们刚才说的source和destination,我们认为它是一个个字符进行拷贝的,把\0拷贝完成就停止。
这里我们可以看看到底有没有将\0拷贝过去,如下:
在这里插入图片描述
此时我们可以看到\0也被拷贝过去了。既然我们需要将\0拷贝过去,那么我们源头中的字符串也需要有\0。如果我们去掉\0会发生什么呢?如下:

在这里插入图片描述
拷贝将不会有停下的动作,一直进行拷贝,甚至会越界往后进行修改。
注意:

  1. 在拷贝时,我们的目标空间必须足够大,只有足够大,才能放下从源头拷贝过来的数据
  2. 目标空间必须可修改,如图:
    在这里插入图片描述
    这里的p是常量字符串,不能进行修改。

2.2 strcpy函数的模拟实现

我们首先创建arr1,里面放上abcdef,再创建一个arr2,里面可以放上20个元素。根据刚才学到的strcpy的参数部分,我们也可以将my_strlen中的参数设置为char * dest 和char * src。暂时我们把返回这里写为void。
我们将arr2和arr1传过去之后,dest和src分别指向如下位置:
在这里插入图片描述
这里我们需要将字符一个个拷贝过去,即我们需要进行多次拷贝,我们可以写一个while循环,在里面使dest和src++来不停的往后。当\0也拷贝下来时循环结束,所以我们把条件写为 * src! = ’\0’,此时\0并没有拷贝下来,我们添加 *dest = * src即可(停下来时 * src为\0,我们此时相当于把‘\0’拷贝过去)。此时代码就完成了。

代码:

#include<stdio.h>
void my_strcpy(char* dest, char* src)
{while (*src != '\0'){*dest = *src;src++;dest++;}*dest = *src;
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s\n",arr2);return 0;
}

运行结果:
在这里插入图片描述
现在我们进行优化,把代码的改为后置++,用完后再++,然后我们的 * dest++ = * src++和 * dest = * src是有一点重复的,我们需要改为如下写法:

#include<stdio.h>
void my_strcpy(char* dest, char* src)
{while (*dest++ = *src++){;}
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s\n",arr2);return 0;
}

理解:
第一次 * src是a,我们将a赋值过去,此时整个表达式的值就为a,a的ASCII码值不为0,为真,进入循环,因为赋值完成以后进行++,则下一次 * src拿到的值就是b,然后再进行该过程,直到 * src指向\0,将\0赋值过去,此时表达式的结果为\0,\0的ASCII码为0,0为假,跳出循环。我们会发现这里我们既可以赋值,赋值产生的值有可以进行判断。
我们还可以对代码进行调整,我们的目的是将src指向的内容拷贝到dest指向的空间里面去,我们不希望src指向的空间被修改。这里可以加const进行修饰,但是解引用之前我们害怕为空指针,我们可以利用assert断言进行处理。

代码:

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest, const char* src)
{assert(dest && src);while (*dest++ = *src++){;}
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s\n",arr2);return 0;
}

但是strcpy的返回值的类型是char*,与我们自己写的函数是不同的,那使用char * 有什么好处吗?
函数是将原字符串拷贝放到目标空间里面去,我们是期望目标空间发生变化来进行观察。所以函数最终返回目标空间的起始位置。但是我们这里不能直接return dest。因为这里dest不断地++以后,dest指向的不再是起始地址,解决方式是我们创建一个 char * 的ret把未进行改动的dest存一份,最后return ret。

代码:

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };char* ret = my_strcpy(arr2, arr1);printf("%s\n",ret);return 0;
}

运行结果:
在这里插入图片描述
此时我们的函数更加灵活,my_strcpy的返回值也可以作为其他函数的参数,实现链式访问。

代码:

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };/*char* ret = my_strcpy(arr2, arr1);*/size_t len = strlen(my_strcpy(arr2, arr1));printf("%zd\n",len);return 0;
}

运行结果:
在这里插入图片描述

3.strcat

3.1 strcat函数的理解和使用

该函数的作用是字符串的追加,我们直接上实例进行理解:
在这里插入图片描述

我们现在有一个数组arr1,里面存放着hello。我们想在后面追加world。可能有同学会想用strcpy,但是它会将hello给覆盖。所以以我们会使用strcat这个函数。

现在我们研究一下这个函数:
在这里插入图片描述
我们不难发现这与我们刚才看到的strcpy的参数是一样的,第一个参数是char * destination,是我们需要追加的对象,第二个参数是const char * source,是需要追加的内容。这个函数的返回值的路线是char *,返回的是目标空间的起始地址(与我们之前讲的strcpy一样)。
我们现在看看是如何追加的:
在这里插入图片描述
这里是在第一个\0的位置开始追加world,我们不免会想这里我们是将world的\0追加过来了,还是原来在arr1中的?我们可以测试看看,我们可以在原arr1中添加一个\0并观察试试。
在这里插入图片描述
在这里插入图片描述
两张图对比我们可以发现,world从hello后面的\0开始追加,world还把它原来的\0也带了过来。

strcat的原理:

  1. 找到目标空间中的第一个\0
  2. 然后从这个\0的位置开始追加源头字符串
  3. 源头字符串的内容,包括\0都会追加到目标空间

注意:
在追加时目标空间的大小要足够长,能够放下我们要追加的数据。其次目标空间要可修改,以便追加数据。因为会将源头字符串字符串的\0追加过去,所以我们的源头字符串要有\0。目标字符串也要有\0,不然不知道从哪里开始追加。

3.2 strcat 函数的模拟实现

我们之前观察过它的参数和返回类型,这些部分是和strcpy一样的。我们就可以仿照来写代码。
我们首先需要在目标空间中找到\0再进行追加,这里我们可以利用while循环往后找,如果 * dest不等于\0,我们就让dest++,直到dest指向\0跳出循环。
之后我们需要将world这个数据拷贝过去 ,这个拷贝数据的代码我们观察已经学习过了,我们可以照搬过来。刚才dest已经指向了\0,现在我们进行拷贝就会将\0覆盖。
接下来我们要返回char * 的数据,即返回目标空间的起始地址,但是我们的dest通过++已经走很远了,我们可以仿照刚才的ret来存放目标空间的起始地址,最后返回ret。当然如果担心我们的指针有效性也可以采用assert断言一下。

代码:

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest != '\0')dest++;while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20] = "hello ";my_strcat(arr1, "world");printf("%s\n", arr1);return 0;
}

运行结果:
在这里插入图片描述
思考:
我们能不能自己给自己追加?
进行传参以后我们的dest和src指向的位置为:
在这里插入图片描述

程序开始运行以后我们的dest会一直往后找,直到找到\0,之后开始拷贝,此时h就会将原来的\0覆盖,没有\0以后拷贝的这个循环是停不下来的,就会造成死循环的问题。
在这里插入图片描述
所以我们通常是不会用这个函数进行对自己追加的操作的。strcat在进行自己给自己追加时会有一定的概率会成功,我们如果想要自己给自己追加可以使用strncat。
好了今天知识就学习到这里,我们下期blog再见!如果文章内容有误,请大佬在评论区斧正!谢谢大家!
在这里插入图片描述

相关文章:

字符串函数(2)

目录 前言1. strlen1.1 strlen函数的理解和使用1.2 strlen函数的模拟实现 2. strcpy2.1 strcpy函数的理解和使用2.2 strcpy函数的模拟实现 3.strcat3.1 strcat函数的理解和使用3.2 strcat 函数的模拟实现 前言 在上一篇文章中&#xff0c;我们对字符分类函数和字符转换函数进行…...

Linux--守护进程与会话

进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示&#xff1a; 为什么会有进程组&#xff1f; 批量操作&#xff1a;进程组允许将多个进程组织在一起&#xff0c;形成一个逻辑上的整体。当需要对多个进程…...

C++ 笔试常用算法模板

C 笔试常用算法模板 一、二叉树遍历DFSBFS 二、回溯模板三、动态规划01背包朴素版本滚动数组优化 完全背包朴素版本滚动数组优化 最长递增子序列朴素版本贪心二分优化 最长公共子序列最长回文子串 四、图建图邻接矩阵邻接表 图的遍历DFSBFS 拓扑排序并查集最小生成树Kruskalpri…...

李宏毅2023机器学习作业HW07解析和代码分享

ML2023Spring - HW7 相关信息&#xff1a; 课程主页 课程视频 Kaggle link 回来了 : ) Sample code HW07 视频 HW07 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. HW7 的代码都很易懂&#xff0c;可以和 2024 年的新课&#xff1a;生成式AI导论做一个很好的衔接&#…...

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具&#xff1b;也是自动化运维的重要工具&#xff1b;可以批量配置、部署、管理上千台主机&#xff1b;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式&#xff1a; 模块化操作&#xff0c;命令行执行…...

【若依框架】按时间查询数据的操作

【若依框架】按时间查询数据的操作 若依框架按起止时间查询数据示例&#xff1a; Date tempDate DateUtil.offsetDay(new Date(), -days);Map<String, Object> map new HashMap<>();map.put("beginRecordTime", DateUtil.beginOfHour(tempDate));map.…...

人工智能将来好就业吗?

人工智能将来好就业吗? 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为推动全球经济发展的核心力量之一。从智能机器人到自动驾驶汽车&#xff0c;从语音识别到图像分析&#xff0c;AI正在改变我们的工作方式以及我们与世界的互动方式。那么&am…...

JAVA SE 11

文章目录 JDK 11 特性介绍语法增强1. String类的增强2. Optional类的增强3. 新的HTTP/2客户端4. var关键字的扩展5. Collection接口的增强 语法改进JDK 11引入的一些语法改进 详细介绍1. 模块化系统&#xff08;Java平台模块系统&#xff0c;JPMS&#xff09;2. HTTP客户端3. 改…...

【MySQ】在MySQL里with 的用法

在MySQL中&#xff0c;WITH语句通常与公用表表达式&#xff08;Common Table Expressions&#xff0c;简称CTE&#xff09;一起使用。CTE是一种临时的结果集&#xff0c;类似于视图或子查询&#xff0c;它们在查询中被定义并且可以在一个或多个SELECT、INSERT、UPDATE或DELETE语…...

多源最短路径

文章目录 1. 01 矩阵&#xff08;542&#xff09;2. 飞地的数量&#xff08;1020&#xff09;3. 地图分析&#xff08;1162&#xff09;4. 地图中的最高点&#xff08;1765&#xff09; 1. 01 矩阵&#xff08;542&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 这…...

在 Mac 中设置环境变量

目录 什么是环境变量&#xff0c;为什么它们重要&#xff1f;什么是环境变量&#xff1f;举个例子 如何查看环境变量如何设置和修改环境变量1. 临时设置环境变量2. 永久设置环境变量3. 修改现有环境变量 环境变量在开发中的应用在 Node.js 项目中使用环境变量在 Python 项目中使…...

记录一次ubuntu /mysql/redis/nginx等 系统安装

没想到还会做一次系统安装配置类的工作&#xff0c;没办法&#xff0c;碰到问题了&#xff0c;总得解决。 安装 &网络配置 从网上下载了ubuntu 18.04.6的安装包&#xff0c;用UltraISO做安装盘&#xff0c;到服务器上修改了下启动顺序&#xff0c;ubuntu的安装非常简单&a…...

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…...

nano 命令:文本编辑器

一、命令简介 ​nano​ 是一个简单易用的文本编辑器&#xff0c;适合初学者和那些不需要复杂功能的用户。 ​​ ‍ 相关命令&#xff08;不同难度的编辑器&#xff09;&#xff1a; 初级难度&#xff1a;nano中级难度&#xff1a;vim终极难度&#xff1a;Emacs ‍ 二、命…...

【2020工业图像异常检测文献】SPADE

Sub-Image Anomaly Detection with Deep Pyramid Correspondences 1、Background 利用深度预训练特征的最近邻&#xff08; kNN &#xff09;方法在应用于整个图像时表现出非常强的异常检测性能。kNN 方法的一个局限性是缺乏描述图像中异常位置的分割图。 为了解决这一问题&a…...

C++QT医院专家门诊预约管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 医院专家门诊预约管理系统 [要求] 该系统需创建和管理以下信息&#xff1a;1、门诊专家信息&#xff1a;专家姓名、编号、性别、年龄、职称、门诊科目、服务时间、门诊预约数据集等&#xff1b;2、门诊预约信息…...

在SpringBoot项目中利用Redission实现布隆过滤器(布隆过滤器的应用场景、布隆过滤器误判的情况、与位图相关的操作)

文章目录 1. 布隆过滤器的应用场景2. 在SpringBoot项目利用Redission实现布隆过滤器3. 布隆过滤器误判的情况4. 与位图相关的操作5. 可能遇到的问题&#xff08;Redission是如何记录布隆过滤器的配置参数的&#xff09;5.1 问题产生的原因5.2 解决方案5.2.1 方案一&#xff1a;…...

【prefect】python任务调度工具 Prefect | 可视化任务工具 | Python自动化的终极武器 | 高效数据管道管理

一、产品介绍 1、官方 Github https://github.com/PrefectHQ/prefect 2、官方文档 https://docs.prefect.io/3.0/get-started/index 3、Pgsql说明 正确的python链接pgsql如下&#xff1a; import psycopg2 from sqlalchemy import create_enginedef connect_with_psycopg2(…...

蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推

蓝禾&#xff0c;汤臣倍健&#xff0c;三七互娱&#xff0c;得物&#xff0c;顺丰&#xff0c;快手&#xff0c;游卡&#xff0c;oppo&#xff0c;康冠科技&#xff0c;途游游戏&#xff0c;埃科光电25秋招内推 ①蓝禾 【岗位】国内/国际电商运营&#xff0c;设计&#xff0c…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...