C语言(字符和字符串函数)2
Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~
💥个人主页:小羊在奋斗
💥所属专栏:C语言
本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为一些学友们展示一下我的学习过程及理解。文笔、排版拙劣,望见谅。
6、strcmp 的使用和模拟实现
7、strncpy、strncat 和 strncmp
8、strtok 的使用和模拟实现
9、strstr 的使用和模拟实现
10、strerror 函数的使用
6、strcmp 的使用和模拟实现
6.1 strcmp 的用法
其实对于 strcmp 函数我们并不陌生,在之前的学习中已经不止一次用到过。
strcmp 函数的作用是比较两个字符串的大小,当结果是大于时返回一个正值,小于时返回一个负值,等于时返回0。所以 strcmp 函数的返回值是int类型,我们在使用字符串函数的时候一定要清楚每个函数的返回值是什么。
要特别注意的是,strcmp 函数比较两个字符串比较的不是字符串的长度,而是对应位置字符的ASCII码值。
可以看到,当对应位置字符的ASCII码值前者大于后者时,strcmp 函数返回了1;当小于时,strcmp 函数返回了-1;当等于时,strcmp 函数返回了0。来看下面代码示例:
这个代码有没有什么问题呢?其实,上面的代码在VS中是没有任何问题的,但是在其他编译器中可能就会发生错误。其中的原因在 strcmp 函数的返回值上,我们说当前面的字符串大于后面的字符串时返回一个正值,但这个正值可以是任意正值,而在VS上规定这个正值为1,但是在其他编译器上并不见得这个正值都为1。
6.2 strcmp 的模拟实现
有了前几个模拟实现字符串函数的经验,模拟 strcmp 函数难度也不是太大。
#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}if (*str1 > *str2){return 1;}else{return -1;}
}int main()
{char str1[] = "abcdef";char str2[] = "abcijk";int ret = my_strcmp(str1, str2);printf("%d\n", ret);return 0;
}
特别的,还可以简化成下面的形式。
7、strncpy、strncat 和 strncmp
出了 strcpy、strcat 和 strcmp 外,C语言还提供了更加灵活的 strncpy、strncat 和 strncmp,它们算是前三者的升级版,使用起来更加灵活。以 strncpy 为例:
可以看到 strncpy 相较于 strcpy 多了一个参数,用于指定拷贝多少个字符。另外两个也是类似。
虽然它们的逻辑表面上看起来是一样的,但是 strcnpy 和 strncat 之间还是有一点差异的。
可以看到 strncpy 不会给目标字符串主动添加 ‘\0’,但 strncat 就会主动给目标字符串添加 ‘\0’,这是两个函数间的差异。
那既然有了 strncat 函数,我们就能弥补上一小节中未能实现字符串自己拼接到自己后面的遗憾了。
8、strtok 函数的使用
更多详细介绍请跳转阅读 —> strtok, strtok_s - cppreference.com
看了上面的介绍好像还是云里雾里的,我用通俗的话来解释一下。delim 指向一个字符串,定义了用作分隔符的字符集合;第一个参数指定一个字符串,它包含了0个或多个由delim字符串中的一个或多个分隔符分割的标记;strtok 函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(strtok 函数会改变被操作的字符串,所以被 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改);strtok 函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok 函数将保存它在字符串中的位置;strtok 函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记;如果字符串中不存在更多标记,则返回NULL指针。也就是说,只需要传递一次指向字符串的非空指针,剩下的都传空指针。
上面的描述其实说的是 strtok 函数是一个过滤指定字符,提取出你想要的部分的函数。比如,有一个邮箱地址 18655404590@163.com,我们想要剔除其中的特殊字符 ‘@’ 和 ‘.’ ,提取出18655404590、163和com,那我们就可以使用 strtok 函数来实现。其中字符指针str指向目标字符串“18655404590@163.com”,delim 指向指定的分隔符“@、.”。
但是,上面是我们事先知道字符串中有两个分隔符,所以写了三个打印函数,那如果我们不知道一个字符串中有多少个分隔符呢?这里可以用for循环来解决,之前我们在介绍for循环的文章中说过这么一句话,for循环通常用来解决循环次数未知的情况。
9、strstr 的使用和模拟实现
9.1 strstr 的使用
更多详细介绍请跳转阅读 —> strstr - cppreference.com 简单来说,strstr 函数的作用是在一个字符串中查找另一个字符串,找到了就返回这个字符串第一次出现的起始地址,没找到就返回一个空指针。来看示例:
9.2 strstr 的模拟实现
模拟实现 strstr 函数之前,我们需要想清楚怎么在一个字符串中找另一个字符串是否存在呢?容易想到的是两个字符串通过指针解引用来一个一个的比较来判断是否存在一个相同的字符串,大致思路如下:
(1)逐个字符地访问被查找的字符串,当访问到与目标字符串首字符相同的字符时记住这个可能的地址,方便后面返回;
(2)当两个字符串的字符两两比较一直到目标字符串访问到 ‘\0’ 时说明找到了,返回之前记住的地址;
(3)当被查找的字符串访问到 ‘\0’ 时说明被查找的字符串不存在,返回一个空指针;
(4)综上,需要创建三个指针,其中两个指向被查找字符串,一个用来逐个访问字符,一个用来记住可能的地址,第三个指针指向目标字符串并且在改变了指针的指向后重新让其指向目标字符串的首地址。
#include <stdio.h>
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;//用于返回可能的地址if (*str2 == '0')//当目标字符串是空字符串时{return cur;}while (*cur != '\0'){ s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')//找到了目标字符串{return cur;}cur++;}return NULL;//没找到
}int main()
{char str1[] = "abcdddeab";char str2[] = "deab";char* ps = my_strstr(str1, str2);if (NULL == ps){printf("不存在\n");}else{printf("%s\n", ps);}return 0;
}
10、 strerror 函数的使用
更多详细介绍请跳转阅读 —> strerror, strerror_s, strerrorlen_s - cppreference.com
简单地说,strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量 errno 来记录程序当前的错误码,只不过程序启动的时候 errno 是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码存放在 errno 中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的,strerror 函数就可以将错误对应的错误信息字符串的地址返回来。
整数0~10对应的错误信息如下:
再来举一个例子,其中涉及到一些我们之前还没学到的内容,请不要在意,主要是 strerror 函数的用法。
C语言函数中还有一个函数和 strerror 函数的功能是相似的,它就是 perror 函数。来看一下它的介绍:
它和 strerror 函数的区别在哪里呢?
strerror 函数的功能是将错误码对应的错误信息的字符串的地址返回,而 perror 函数的功能是将 errno 中错误码对应的错误信息打印出来。那它是怎样打印的呢?perror 函数打印的规则是先打印字符指针s指向的字符串,再打印一个冒号和一个空格,然后打印错误码对应的错误信息。
可以看到上面 printf 函数和 perror 函数打印的内容是一样的。
也就是说 perror == printf + strerror。我们可以根据自己的选择选用这两个函数。
如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。
相关文章:
C语言(字符和字符串函数)2
Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…...
【数据结构与算法 | 栈篇】力扣20,150
1. 力扣20 : 有效的符号 (1). 题 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…...
node依赖安装的bug汇总
1.npm仓库 首先要获取npm仓库的地址: registryhttp://11.11.111.1:1111/abcdefg/adsfadsf 类似这种的地址 然后设置npm仓库: npm config set registryhttp://11.11.111.1:1111/abcdefg/adsfadsf (地址要带等号) 接着安装依赖: npm i…...
Python中的 Lambda 函数
大家好,在 Python 编程的世界里,有一种功能强大却不常被提及的工具,它就是 Lambda 函数。这种匿名函数在 Python 中拥有着令人惊叹的灵活性和简洁性,却常常被许多开发者忽视或者只是将其当作一种附加功能。Lambda 函数的引入&…...
服务器遭遇黑洞后如何快速恢复与防范
在互联网世界中,“黑洞"一词常用于描述一种网络安全措施,即当服务器遭遇大规模DDoS攻击,为了保护网络基础设施和其他用户免受影响,网络服务商会暂时将受到攻击的IP地址流量导向一个"空洞”,使其不再响应任何…...
GPT-4o有点坑
GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的,但是看了相关的评论一直在说:技…...
【机器学习】探索未来科技的前沿:人工智能、机器学习与大模型
文章目录 引言一、人工智能:从概念到现实1.1 人工智能的定义1.2 人工智能的发展历史1.3 人工智能的分类1.4 人工智能的应用 二、机器学习:人工智能的核心技术2.1 机器学习的定义2.2 机器学习的分类2.3 机器学习的实现原理2.4 机器学习的应用2.5 机器学习…...
OceanBase 4.3.0 列存引擎解读:OLAP场景的入门券
近期,OceanBase 发布了4.3.0版本,该版本成功实现了行存与列存存储的一体化,并同时推出了基于列存的全新向量化引擎和代价评估模型。通过强化这些能力,OceanBase V4.3.0 显著提高了处理宽表的效率,增强了在AP࿰…...
算法每日一题(python,2024.05.25) day.7
题目来源(力扣. - 力扣(LeetCode),简单) 解题思路: 难点:加一时可能出现9使得位数进一,而当特殊情况,即全部为9时,数组所在长度会变长一。 从末尾开始判断&…...
【正在线上召开】2024机器智能与数字化应用国际会议(MIDA2024),免费参会
【ACM出版】2024机器智能与数字化应用国际会议(MIDA2024) 2024 International Conference on Machine Intelligence and Digital Applications 【支持单位】 宁波财经学院 法国上阿尔萨斯大学 【大会主席】 Ljiljana Trajkovic 加拿大西蒙菲莎大…...
景源畅信:抖音的爆款视频怎么选?
在短视频风起云涌的今天,抖音作为其中的佼佼者,每天都有无数视频在这里诞生。但如何在内容海洋中脱颖而出,成为人们茶余饭后谈论的焦点,是许多创作者和品牌思考的问题。选择爆款视频,不仅需要对平台规则有深刻理解&…...
开源大模型源代码
开源大模型的源代码可以在多个平台上找到,以下是一些知名的开源大模型及其源代码的获取方式: 1. **艾伦人工智能研究所的开放大语言模型(Open Language Model,OLMo)**: - 提供了完整的模型权重、训练代…...
算法思想总结:哈希表
一、哈希表剖析 1、哈希表底层:通过对C的学习,我们知道STL中哈希表底层是用的链地址法封装的开散列。 2、哈希表作用:存储数据的容器,插入、删除、搜索的时间复杂度都是O(1),无序。 3、什么时…...
基于Docker搭建属于你的CC++集成编译环境
常常,我会幻想着拥有一个随时可以携带、随时可以使用的开发环境,那该是多么美好的事情。 在工作中,编译环境的复杂性常常让我头疼不已。稍有不慎,删除了一些关键文件,整个编译链就会瞬间崩溃。更糟糕的是,…...
如何限制上网行为?上网行为管控软件有什么功能?
上网行为的管理与限制对于保障企业安全、提高员工工作效率以及保护孩子健康成长都显得尤为重要。 上网行为管控软件作为一种专业的工具,在这方面发挥着不可替代的作用。 本文将探讨如何限制上网行为,并介绍上网行为管控软件的主要功能。 一、如何限制上…...
重庆耶非凡科技有限公司的选品师项目靠谱吗?
在跨境电商和零售市场日益繁荣的今天,选品师的角色愈发凸显出其重要性。重庆耶非凡科技有限公司作为一家致力于多元化服务的科技公司,其选品师项目备受关注。那么,重庆耶非凡科技有限公司的选品师项目靠谱吗?接下来,我们将从多个…...
基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务
部署前准备: Cloudflare 账号 https://dash.cloudflare.com/login CloudDNS 账号 https://www.cloudns.net/ GitHub 账号 https://github.com/Harry-zklcdc/go-proxy-bingai Cloudflare 部署 Worker CloudDNS 获取免费二级域名 GitHub New Bing Ai 项目 https://git…...
redux状态管理用法详解
在React中使用redux,官方要求安装俩个其他插件 - Redux Toolkit 和 react-redux 1.ReduxToolkit (RTK) 官方推荐编写 Redux 逻辑的方式,是一套工具的集合集,简化书写方式 简化 store 的配置方式; 内置 immer 支持…...
细说ARM MCU中的MX_GPIO_Init()函数的实现过程
目录 1、建立.ioc工程 2、 MX_GPIO_Init()函数 (1)MX_GPIO_Init()函数的类型 (2)MX_GPIO_Init()函数中用到的结构体变量 (3)MX_GPIO_Init()函数使能时钟 (4)MX_GPIO_Init()函数…...
【wordpress】网站提示Error establishing a database connection错误代码
Error establishing a database connection错误代码处理方法: 检查数据库连接情况检查数据库账号密码是否正确检查数据库是否开启 总之较大可能是数据库出现了问题...
图书管理系统——Java实现
文章目录 Java实现图书管理系统问题分析框架搭建业务实现项目测试代码演示BookioperationUserMain(默认包) Java实现图书管理系统 学习了前六篇的SE语法,我们现在要用它们实现一个简单的图书管理系统项目,深入了解各个知识点的应…...
Capto 标准版【简体中文+Mac 】
Capto 是一套易于使用的屏幕捕捉、视频录制和视频编辑 Capto-capto安装包-安装包https://souurl.cn/DPhBmP 屏幕录制和教程视频制作 记录整个屏幕或选择的任何特定区域。在创建内容丰富的教程视频时选择显示或隐藏光标。无论您做什么,都可以确保获得高质量的视频。…...
连锁收银系统的五大功能 会员营销是核心
连锁企业的收银系统是其经营管理的关键工具之一,具备多种功能可以帮助企业提高效率、优化服务并实现会员营销。以下是连锁收银系统的五大功能,其中会员营销作为核心功能将在最后详细讨论。 首先,收银系统应具备高效的销售管理功能。这包括商品…...
射频功率限幅器简略
在功率输入保护方面,限幅器是最好用的器件之一,可以保护后级电路不受超限功率的损害,限幅器其实像TVS功能一样,让超过阈值的功率释放到接地上,来达到限制幅度的目的,目前限幅器的限幅幅度大多都大于15dBm,很…...
[备忘] Reboot Linux in python
1.可行的Reboot方法 1.1 修改/etc/sudoers 假定当前用户是mimi,增补这一行: mimi ALL(ALL) NOPASSWD: ALL 这是为了免输指令。 sudoers文件尽量在覆盖前把它的权限改回去: 原始权限 mimidebian-vm:~/test_app$ ls -l /tmp/sudoers -r--r-…...
windows打开工程文件是顺序读写吗
在 Windows 操作系统中,打开和读写工程文件的过程可以是顺序读写,也可以是随机读写,具体取决于使用的软件和文件的性质。以下是一些详细解释: 顺序读写 顺序读写(sequential access)是指按文件中数据的顺…...
【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...
【1800】【5.22-5.24】
E1. String Coloring (easy version) E2. String Coloring (hard version) 【细节参考了题解】 题意:序列拆分为最少的若干条不降序列。 思路:简单版可以 n 2 n^2 n2 dp。定义 b o o l d p ( i , j ) bool ~dp(i, j) bool dp(i,j) 表示是否存在方案…...
统计各个商品今年销售额与去年销售额的增长率及排名变化
文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…...
华为校招机试 - 矿车运输成本(20240522)
题目描述 露天矿采矿作业的特点是规模大,矿石和废料的移动量达到百万吨,运输成本开销较大,需要寻求一种最优的运输路径节省成本。 已知矿场可以划分成 N * M 的网格图,每个网格存在地形的差异,因此通过不同网格时,成本开销存在差异。 网格有以下 5 种类型: 标志为 S …...
【C++奇技淫巧】CRTP(奇特重现模板模式)
CRTP(Curiously Recurring Template Pattern,奇特重现模版模式),是一种在C中使用模板来实现的设计模式,主要用于实现编译时多态性(静态多态)。这种模式通过类模板和模板继承机制来实现,使得派生…...
web学习笔记(六十一)
目录 如何使用公共组件来编写页面 如何使用公共组件来编写页面 1.导入公共组件nav.vue import Catenav from "/components/nav.vue"; 2.在页面插入子组件 如果使用了setup语法糖此时就可以直接在页面插入 <Catenav ></Catenav>标签, …...
Nginx在Docker中的应用:容器化部署与扩展
在当今的云计算和微服务时代,Docker容器技术因其轻量级、可移植性和可扩展性而受到广泛关注。Nginx,作为一个高性能的HTTP和反向代理服务器,也在Docker中找到了其广泛的应用场景。本文将探讨Nginx在Docker中的容器化部署和扩展策略࿰…...
vscode编译和调试wsl环境的c语言程序
直接f5会报错,提示你改一下json文件 launch.json { “version”: “0.2.0”, “configurations”: [ { “name”: “(gdb) Launch”, “type”: “cppdbg”, “request”: “launch”, “program”: “ w o r k s p a c e F o l d e r / a . o u t " , " …...
(CPU/GPU)粒子继承贴图颜色发射
GetRandomInfo节点(复制贴进scratch pad Scripts) Begin Object Class/Script/NiagaraEditor.NiagaraClipboardContent Name"NiagaraClipboardContent_22" ExportPath/Script/NiagaraEditor.NiagaraClipboardContent"/Engine/Transient.NiagaraClipboardConten…...
【C#】 一个窗体能够显示、最小化、最大化、关闭时分别触发方法
在C#的WPF应用程序中,窗体(即继承自System.Windows.Window的类)能够通过处理以下事件来响应显示、最小化、最大化和关闭操作: 1.显示: 窗体显示时没有直接对应的事件,但你可以通过覆盖OnLoaded方法或订阅…...
pgsql基本操作
查看已经存在的数据库 postgres# \lList of databasesName | Owner | Encoding | Collate | Ctype | Access privileges ----------------------------------------------------------------------postgres | postgres | UTF8 | C | C | runoobdb …...
3d渲染的常用概念和技术,渲染100邀请码1a12
之前我们介绍了3D渲染的基本原理和流程,这次说下几个常用概念和技术。 3D渲染中涉及到很多专业的概念和技术,它们决定了渲染质量和效果,常用的有以下几个。1、光线追踪 光线追踪是一些专业渲染器(如V-Ray和Corona等)…...
热敏电阻的设计
热敏电阻(NTC)的作用:抑制开机时的浪涌电流。防止开机瞬间产生的浪涌电流损坏后面的元件。 取值依据:根据对开机的脉冲电流(浪涌电流)小于多少A? 由,这个U是指最大输入电压,I为要求的浪涌电流。 NTC是负温度系数的热…...
macOS上编译android的ffmpeg及ffmpeg.c
1 前言 前段时间介绍过使用xcode和qt creator编译调试ffmepg.c,运行平台是在macOS上,本文拟介绍下android平台如何用NDK编译链编译ffmepg库并使用。 macOS上使用qt creator编译调试ffmpeg.c macOS上将ffmpeg.c编译成Framework 大体思路: 其…...
RxSwift - 实现一个MVVM架构的TableView
文章目录 RxSwift - 实现一个MVVM架构的TableView前沿MVVM架构的Tableview目录结构1、模型(Model)2、视图模型(ViewModel)3、视图(View) 界面效果 RxSwift - 实现一个MVVM架构的TableView 前沿 MVVM架构在…...
在 CentOS 7 上安装并配置 Redis 允许远程连接的详细教程
第一部分:安装 Redis Redis 是一款高性能的键值存储系统,广泛应用于缓存、消息队列及数据库场景。下面是如何在 CentOS 7 系统上安装 Redis 的步骤。 步骤1:安装 EPEL 仓库 EPEL (Extra Packages for Enterprise Linux) 提供了许多 CentOS 默…...
越来越多企业选择开源批发订货系统
在当今竞争激烈的市场环境中,越来越多的企业选择开源批发订货系统来提高运营效率、降低成本并实现业务的数字化转型。以下是开源批发订货系统的四大优势及其重要功能: 首先,开源批发订货系统具有高度的灵活性和定制性。由于其源代码开放&…...
KT6368A双模蓝牙芯片上电到正常发送AT指令或指令复位需要多久
一、简介 KT6368A芯片上电到正常发送AT指令,或者开启蓝牙广播被搜索到,或者指令复位需要多久等等系列问题总结 详细描述 其实这些问题归结到一起,就还是一个问题,芯片上电需要多久的时间 在另外一份文档里面,是有描…...
代码随想录算法训练营第38天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
代码随想录算法训练营第38天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 理论基础自己看到题目的第一想法看完代码随想录之后的想法 链接: 509. 斐波那契数 链接: 70. 爬楼梯 链接: 746. 使用最小花费爬楼梯 理论基础 五部曲: 1.确定dp数组…...
变现实谈,我要的不是灵光一现,而是真实的实现!——感悟篇
变现要的是行动不是想法 正文时代奇点奇迹 点题以己及人 正文 每当我看到了一个有趣的事情 我会在脑中构思一些想法 会贴合我当下的想要做的事情 比如 在我写下这篇文章之前 我看到了 二战期间的诞生的一个奇迹 可口可乐 我就思考 咦 原来可口可乐居然是在这么个时间点成长…...
Matlab操作Excel筛选指定数据的对应数据
Matlab中在表格中寻找指定汉字,并返回其所在行数, 将该行数的另一列提取出来。 目录 一、前言 二、直接在命令行输出 三、保存筛选数据excel 一、前言 源数据excel: 指定汉子:买,得到下面数据: 二、直接…...
对于C++STL及其时间复杂度的总结
由于本次在山东CCPC邀请赛中,对于堆的时间复杂度记忆不清晰,导致第4题没有做出来,与铜牌失之交臂,故觉应整理STL的时间复杂度。 本文仅整理有用(竞赛)的stl及其用法,并且不阐述过于基础的内容。…...
Docker搭建FRP内网穿透服务器
使用Docker搭建一个frp内网穿透 在现代网络环境中,由于防火墙和NAT等原因,内网设备无法直接被外网访问。FRP (Fast Reverse Proxy) 是一款非常流行的内网穿透工具,它能够帮助我们将内网服务暴露给外网。本文将介绍如何在Linux服务器上使用Do…...
【NumPy】掌握NumPy的divide函数:执行高效的数组除法操作
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...