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

嵌入式(c语言篇)Day9

嵌入式Day9

C语言字符串标准库函数笔记

一、概述

C语言提供了一系列字符串标准库函数用于处理字符串,使用这些函数需要包含头文件 <string.h>。主要函数包括求字符串长度、字符串复制、字符串拼接和字符串比较等。我们不仅要理解这些函数的行为,还需掌握手动实现的方法。

二、字符串长度计算

2.1 strlen 函数

  • 函数声明
size_t strlen(const char *s);
  • 功能:计算字符串 s 的长度,即从首字符到 \0 前的字符数,不包含 \0
  • 返回值size_t 类型(无符号整数)。
  • 注意事项
    • 参数必须是合法字符串,确保 s\0 结尾,否则会越界访问,导致未定义行为。
    • sizeof 区别:strlen(str) 求字符串实际长度(不含 \0);sizeof(str) 求字符数组总长度(含 \0 或预留空间)。
  • 示例代码
int main() {char str[] = "abcd";        // 长度4,数组大小5(含\0)char str2[10] = "12345";    // 长度5,数组大小10char str3[5] = {'a', '\0', 'c'}; // 长度1(遇\0停止)char str4[4] = "1234";      // 非字符串(无\0),strlen(str4) 为未定义行为printf("strlen(str) = %zu\n", strlen(str));   // 4printf("sizeof(str) = %zu\n", sizeof(str));   // 5return 0;
}
  • 手动实现方法
    • 方法1:遍历计数
size_t my_strlen(const char *s) {size_t len = 0;while (*s) {  // 遇\0终止len++;s++;}return len;
}
  • 方法2:指针移动计数(变种)
size_t my_strlen2(const char *s) {size_t len = 0;while (*s++) {  // 先取值,后移动指针len++;}return len;  // 空字符不计数
}
  • 方法3:指针差值法
size_t my_strlen3(const char *s) {const char *p = s;while (*p) {  // p移动到\0位置p++;}return p - s;  // 指针差值即长度
}
  • 方法4:指针差值变种
size_t my_strlen4(const char *s) {const char *p = s;while (*p++);  // p移动到\0下一个位置return p - s - 1;  // 减去多余的一步移动
}

2.2 strlen vs sizeof 对比

场景strlen(s)sizeof(s)
s 是字符数组名字符串实际长度(不含 \0数组总字节数(含 \0/预留空间)
s 是指针(如函数参数)字符串长度指针变量大小(32位4字节,64位8字节)

示例代码

void func(const char *str) {printf("sizeof(str) = %zu\n", sizeof(str));  // 指针大小(如4字节)
}int main() {char str[] = "Clearlove";  // 长度9,数组大小10(含\0)printf("strlen(str) = %zu\n", strlen(str));  // 9printf("sizeof(str) = %zu\n", sizeof(str));  // 10func(str);  // 数组名退化为指针,sizeof为4字节return 0;
}

三、字符串复制

3.1 strcpy 函数

  • 函数声明
char *strcpy(char *dest, const char *src);
  • 功能:将 src 字符串完整复制到 dest 中(含 \0)。
  • 返回值dest 指针(用于链式操作)。
  • 注意事项
    • 目标数组必须足够大,否则会越界,引发未定义行为(不安全)。
    • 源必须是合法字符串,确保 src\0 结尾。
    • 支持链式复制,如 strcpy(dest2, strcpy(dest1, src))
  • 示例代码
int main() {char src[] = "";char dest[100], dest2[100];// 链式复制strcpy(dest2, strcpy(dest, src));  // 等价于两次单独复制puts(dest);  // 输出:puts(dest2); // 输出:return 0;
}
  • 手动实现方法
    • 方法1:手动添加 \0
char *my_strcpy(char *dest, const char *src) {char *temp = dest;  // 保存目标指针初始位置while (*src) {      // 复制字符直到\0前*dest++ = *src++;}*dest = '\0';       // 手动添加空字符return temp;
}
  • 方法2:利用循环条件自动复制 \0
char *my_strcpy2(char *dest, const char *src) {char *temp = dest;while (*dest++ = *src++) {  // 先赋值(含\0),后移动指针;  // 循环条件为*src,复制完\0后条件为假,终止循环}return temp;
}

3.2 strncpy 函数

  • 函数声明
char *strncpy(char *dest, const char *src, size_t n);
  • 核心功能:将 src 字符串中最多 n 个字符复制到 dest 字符数组中,可通过限制复制字符数量避免越界,比 strcpy 更安全。
  • 关键注意事项
    • n 的取值建议:推荐取值为 sizeof(dest) - 1,为 \0 预留空间,确保 dest 有足够空间存储复制内容及结尾空字符,避免越界。
    • 复制行为与字符串完整性
      • n < strlen(src)+1 时,仅复制 n 个字符,dest 不是字符串(无 \0),需手动添加 \0
      • n = strlen(src)+1 时,完整复制 src(含 \0),dest 是合法字符串。
      • n > strlen(src)+1 时,复制完 src 后,剩余 n - (strlen(src)+1) 个位置填充 \0,确保 dest 是字符串。
    • 安全调用惯用法
strncpy(dest, src, sizeof(dest) - 1);  // 限制复制长度
dest[sizeof(dest) - 1] = '\0';          // 手动添加空字符
  • 函数行为详解
    | 场景 | 复制行为 | 结果 |
    | — | — | — |
    | n < strlen(src)+1 | 仅复制前 n 个字符,不包含 \0 | dest 非字符串,需手动补 \0 |
    | n = strlen(src)+1 | 完整复制 src(含 \0) | dest 是合法字符串 |
    | n > strlen(src)+1 | 复制 src 全部内容后,剩余位置填充 \0 直至达到 n 个字符 | dest 是合法字符串,尾部多 \0 |
  • 示例代码
int main() {char src[] = "hello";       // strlen(src)+1 = 6(含\0)char dest[10];              // sizeof(dest)-1 = 9// 场景1:n < 6(如n=3)strncpy(dest, src, 3);      // 复制"hel",dest[3]未处理dest[3] = '\0';             // 手动补\0,否则puts(dest)会乱码// 场景2:n = 6strncpy(dest, src, 6);      // 复制"hello\0",dest是字符串// 场景3:n = 10(>6)strncpy(dest, src, 10);     // 复制"hello\0\0\0\0"(后4位补\0)return 0;
}
  • 手动实现方法
    • 版本1:安全处理剩余空间
char *my_strncpy(char *dest, const char *src, size_t n) {char *temp = dest;          // 保存目标数组起始地址size_t i;// 复制src字符,最多n个for (i = 0; i < n && *src; i++) {*dest++ = *src++;}// 填充剩余空间为\0(若n > src长度)if (i < n) {for (; i < n; i++) {*dest++ = '\0';}}return temp;
}
  • 版本2:循环优化
char *my_strncpy2(char *dest, const char *src, size_t n) {char *temp = dest;while (n-- && (*dest++ = *src++)) {// 循环条件:n>0 且 src未到\0// 自动复制\0当src结束时}// 若n>0(src已结束,剩余空间补\0)while (n--) {*dest++ = '\0';}return temp;
}
  • strcpy 的对比
    | 特性 | strcpy | strncpy |
    | — | — | — |
    | 安全性 | 不安全(需手动确保 dest 足够大) | 安全(通过 n 限制复制长度) |
    | 空字符处理 | 自动复制 \0 | 仅当 n 足够时复制 \0 |
    | 推荐场景 | 确定 dest 空间足够时 | 不确定 dest 大小时 |
  • 常见错误与解决方案
    • 错误:未手动补 \0(当 n < src 长度)
char dest[3];
strncpy(dest, "abcde", 3);  // 复制"abc",无\0
puts(dest);                  // 输出乱码(继续读取后续内存直到遇\0)

解决方案:复制后手动添加 dest[2] = '\0';

  • 错误:n 取值过大导致越界
char dest[5];
strncpy(dest, "hello", 10); // sizeof(dest)-1=4,正确应为4
// 错误:n=10超过dest可用空间(5-1=4),导致越界

解决方案:始终使用 sizeof(dest)-1 作为 n 的取值。

四、字符串拼接

4.1 strcat 函数

  • 函数声明
char *strcat(char *dest, const char *src);
  • 核心功能:将 src 字符串完整追加到 dest 末尾(含 \0),原理是先定位 dest 末尾的 \0,再执行 strcpy(dest末尾, src)
  • 注意事项
    • 参数必须为合法字符串,destsrc 均需以 \0 结尾,否则越界访问。
    • 目标数组需足够大,需容纳 dest 原有内容 + src 内容 + 1(\0),否则越界导致未定义行为。
    • 返回值为 dest 首地址,可用于链式操作(如 strcat(strcat(dest, src1), src2))。
  • 错误示例
// 错误:dest为指针指向只读字符串,无法修改
char *dest = "hello "; 
strcat(dest, "world!"); // 运行时崩溃(权限错误)// 正确:dest为足够大的字符数组
char dest[20] = "hello "; 
strcat(dest, "world!"); // 结果:"hello world!"
  • 手动实现
char *my_strcat(char *dest, const char *src) {char *tmp = dest;// 定位到dest末尾的\0while (*dest) dest++;// 复制src到dest末尾(含\0)while (*dest++ = *src++); return tmp;
}

4.2 strncat 函数

  • 函数声明
char *strncat(char *dest, const char *src, size_t n);
  • 核心功能:将 src 中最多 n 个字符追加到 dest 末尾,并自动添加 \0。即使越界,末尾也会补 \0;若 n 大于 src 长度,仅复制 src 全部内容(不含后续补 \0)。
  • 安全取值:推荐 n 值为 sizeof(dest) - strlen(dest) - 1,含义为 dest 总长度 - 已用长度 - 1(预留 \0)。
    示例代码
char dest[20] = "hello "; // strlen(dest)=6
strncat(dest, "world!", sizeof(dest)-6-1); // n=13(20-6-1=13)
  • 手动实现
char *my_strncat(char *dest, const char *src, size_t n) {char *tmp = dest;// 定位到dest末尾的\0while (*dest) dest++;// 复制最多n个字符,并手动添加\0while (n-- && *src) {*dest++ = *src++;}*dest = '\0'; // 确保dest以\0结尾return tmp;
}

五、字符串比较

5.1 strcmp 函数

  • 函数声明
int strcmp(const char *str1, const char *str2);
  • 返回值规则
    | 返回值 | 含义 | 类比 |
    | — | — | — |
    | <0 | str1 < str2 | str1 字符编码 < str2 |
    | 0 | str1 == str2 | 完全相等 |
    | >0 | str1 > str2 | str1 字符编码 > str2 |
  • 比较规则(字典序)
    • 逐字符比较,从首字符开始,按ASCII码值比较,直到出现不同字符或 \0
    • 空字符处理:\0 的ASCII码为0,比所有字符小。例如,"abc" < "abd"(第三个字符 c < d);"abc" < "abcd""abc" 提前遇到 \0)。
  • 示例代码
int main() {char str1[] = "apple";char str2[] = "banana";char str3[] = "apple";printf("%d\n", strcmp(str1, str2)); // -1('a' < 'b')printf("%d\n", strcmp(str1, str3)); // 0(完全相等)printf("%d\n", strcmp(str2, str1)); // 1('b' > 'a')return 0;
}
  • 手动实现
int my_strcmp(const char *s1, const char *s2) {while (*s1 && *s2 && *s1 == *s2) { // 相同字符继续比较s1++;s2++;}return *s1 - *s2; // 直接返回编码差(自动处理\0情况)
}

六、函数对比表格

函数功能关键参数安全性结尾处理
strcat拼接字符串dest, src不安全(需手动确保空间)自动复制 src\0
strncat限定长度拼接dest, src, n安全(通过 n 限制)自动补 \0(无论是否越界)
strcmp比较字符串大小/相等str1, str2安全无(仅比较内容)

七、常见错误与最佳实践

7.1 strcat 越界错误

错误代码

char dest[5] = "abc"; // 长度3,数组大小5(含\0)
strcat(dest, "defg"); // 需空间3+4+1=8 >5,越界!

解决方案:使用 strncat 或确保 dest 空间足够大。

7.2 strcmp 误用数值比较

错误代码

if (strcmp(str1, str2) == 1) // 错误:返回值可能为任意正数(如2、3等)
if (strcmp(str1, str2) > 0)  // 正确:判断大小关系

最佳实践:仅通过符号(>0、<0、==0)判断,不依赖具体数值。

相关文章:

嵌入式(c语言篇)Day9

嵌入式Day9 C语言字符串标准库函数笔记 一、概述 C语言提供了一系列字符串标准库函数用于处理字符串&#xff0c;使用这些函数需要包含头文件 <string.h>。主要函数包括求字符串长度、字符串复制、字符串拼接和字符串比较等。我们不仅要理解这些函数的行为&#xff0c…...

006-nlohmann/json 结构转换-C++开源库108杰

绝大多数情况下&#xff0c;程序和外部交换的数据&#xff0c;都是结构化的数据。 1. 手工实现——必须掌握的基本功 在的业务类型的同一名字空间下&#xff0c;实现 from_json 和 to_json 两个自由函数&#xff08;必要时&#xff0c;也可定义为类型的友元函数&#xff09;&a…...

b站视频如何下载到电脑——Best Video下载器

你是不是也经常在B站刷到超赞的视频&#xff0c;想保存到电脑慢慢看&#xff0c;却发现下载不了&#xff1f;别急&#xff0c;今天教你一个超简单的方法&#xff0c;轻松下载B站视频到电脑&#xff0c;高清画质&#xff0c;随时随地想看就看&#xff01; 为什么需要下载B站视频…...

【行为型之模板方法模式】游戏开发实战——Unity标准化流程与可扩展架构的核心实现

文章目录 &#x1f9e9; 模板方法模式&#xff08;Template Method Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;关卡流程系统&#xff09;1. 定义抽象模板类2. 实现具体子类3. 客户端使用 四、模式进阶技巧1. 钩子方法&am…...

每日算法-250514

每日算法学习记录 (2024-05-14) 今天记录三道 LeetCode 算法题的解题思路和代码。 1. 两数之和 题目截图: 解题思路 这道题要求我们从一个整数数组中找出两个数&#xff0c;使它们的和等于一个给定的目标值 target&#xff0c;并返回这两个数的下标。 核心思路是使用 哈希…...

信息安全入门基础知识

信息安全是保护信息系统和数据免受未经授权的访问、使用、披露、中断、修改或破坏的实践。对于个人和组织来说,了解信息安全的基础知识至关重要。 1. CIA三元组 信息安全的三个主要目标,也称为CIA三元组: 机密性(Confidentiality): 确保信息不被未经授权的人访问或披露完整性…...

力扣-98.验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 class Solutio…...

Java 框架配置自动化:告别冗长的 XML 与 YAML 文件

在 Java 开发领域&#xff0c;框架的使用极大地提升了开发效率和系统的稳定性。然而&#xff0c;传统框架配置中冗长的 XML 与 YAML 文件&#xff0c;却成为开发者的一大困扰。这些配置文件不仅书写繁琐&#xff0c;容易出现语法错误&#xff0c;而且在项目规模扩大时&#xff…...

大疆无人机自主飞行解决方案局限性及增强解决方案-AIBOX:特色行业无人机巡检解决方案

大疆无人机自主飞行解决方案局限性及增强解决方案-AIBOX&#xff1a;特色行业无人机巡检解决方案 大疆无人机是低空行业无人机最具性价比的产品&#xff0c;尤其是大疆机场3的推出&#xff0c;以及持续自身产品升级迭代&#xff0c;包括司空2、大疆智图以及大疆智运等专业软件和…...

【机器人】复现 SG-Nav 具身导航 | 零样本对象导航的 在线3D场景图提示

SG-Nav提出了一种新的零样本物体导航框架&#xff0c;用三维场景图来表示观察到的场景。 并设计了一个分层的思路链提示&#xff0c;帮助LLM通过遍历节点和边&#xff0c;根据场景上下文推理目标位置。 本文分享SG-Nav复现和模型推理的过程&#xff5e; 下面是一个查找椅子示…...

详细说说Spring的IOC机制

Spring 的 IOC&#xff08;控制反转&#xff09;是框架的核心机制&#xff0c;用于管理对象的创建和依赖注入&#xff0c;通过将控制权从应用程序代码转移到容器&#xff0c;实现组件间的解耦。以下是详细解析&#xff1a; 1. IOC 核心概念 控制反转&#xff08;Inversion of C…...

Android Activity之间跳转的原理

一、Activity跳转核心流程‌ Android Activity跳转的底层实现涉及 ‌系统服务交互‌、‌进程间通信&#xff08;IPC&#xff09;‌ 和 ‌生命周期管理‌&#xff0c;主要流程如下&#xff1a; ‌startActivity() 触发请求‌ 应用调用 startActivity() 时&#xff0c;通过 Inst…...

第二个五年计划!

下一阶段&#xff01;5年后&#xff01;33岁&#xff01;体重维持在125斤内&#xff01;腰围74&#xff01; 健康目标&#xff1a; 体检指标正常&#xff0c;结节保持较小甚至变小&#xff01; 工作目标&#xff1a; 每年至少在一次考评里拿A&#xff08;最高S&#xff0c;A我理…...

交易所功能设计的核心架构与创新实践

交易所功能设计的核心架构与创新实践 ——从用户体验到安全合规的全维度解析 一、核心功能模块&#xff1a;构建交易生态的四大支柱 1. 用户账户管理 多因子身份验证&#xff1a;集成邮箱/手机注册、谷歌验证器&#xff08;2FA&#xff09;、活体检测&#xff08;误识率<0…...

Windows10安装WSA

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、WSAOnWin10二、安装1.第一种方法2.第二种方法 总结 前言 有时候工作需要用到WSA&#xff0c;然而我们的电脑是Windows10的不能直接安装。接下来我就教你们…...

标签部件(lv_label)

一、如何创建标签部件以及设置文本&#xff1f; 知识点1&#xff1a;如何创建标签部件 lv_obj_t *label lv_label_create(parent); 知识点2&#xff1a;设置文本的3种方式 ①直接设置文本&#xff0c;存储文本的内存动态分配&#xff1a;lv_label_set_text(label,"he…...

Spring中的循环引用

循环依赖发生在两个或两个以上的bean互相持有对方&#xff0c;形成闭环。Spring框架允许循环依赖存在&#xff0c;并通过三级缓存解决大部分循环依赖问题&#xff1a; 一级缓存&#xff1a;单例池&#xff0c;缓存已完成初始化的bean对象。 二级缓存&#xff1a;缓存尚未完成生…...

技术选型不当,如何避免影响项目进展

建立选型评估机制、综合考虑业务与技术匹配度、引入技术决策审查流程、做好选型后的风险预案与替代方案准备 是避免因技术选型不当影响项目进展的关键措施。尤其要重视建立选型评估机制&#xff0c;通过全流程、数据化、多维度的评估体系&#xff0c;确保所选技术能在性能、可维…...

图表制作-基础饼图

首先登录自己的账号&#xff0c;没有账号的可以注册一个。 登录之后&#xff0c;在左侧菜单栏找到图表制作-统计图。 点击新建统计图&#xff0c;点击饼图-基础饼图。 初始会有一些演示数据&#xff0c;可以根据自己的需要进行修改。 如果嫌手动修改太麻烦&#xff0c;可以导入…...

Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网海量设备数据长期存储中的应用优化(248)

往期文章推荐&#xff1a; 《大数据新视界》和《 Java 大视界》专栏&#xff1a; Java 大视界 – Java 大数据在智能教育自适应学习路径动态调整中的应用与实践&#xff08;247&#xff09;(最新&#xff09;Java 大视界 – Java 大数据在智能安防生物特征识别系统中的多模态…...

如何恢复被勒索软件加密的服务器文件(解密与备份策略)

针对勒索软件加密文件的恢复和解密策略&#xff0c;结合当前数据安全最佳实践&#xff0c;整理应对指南如下&#xff1a; 一、文件解密与修复方法 立即隔离设备‌ 断开网络连接并禁用共享功能&#xff0c;防止病毒横向传播 通过文件后缀异常&#xff08;如.locked、.wxx&…...

Java知识框架

一、Java 基础语法 1. 基础语法 数据类型 基本类型&#xff1a;int, double, boolean, char 等 引用类型&#xff1a;String, 数组, 对象 变量与常量 final 关键字 作用域&#xff08;局部变量、成员变量&#xff09; 运算符 算术、逻辑、位运算 三元运算符 ? : 控制…...

腾讯云-人脸核身+人脸识别教程

一。产品概述 慧眼人脸核身特惠活动 腾讯云慧眼人脸核身是一组对用户身份信息真实性进行验证审核的服务套件&#xff0c;提供人脸核身、身份信息核验、银行卡要素核验和运营商类要素核验等各类实名信息认证能力&#xff0c;以解决行业内大量对用户身份信息真实性核实的需求&a…...

102. 二叉树的层序遍历递归法:深度优先搜索的巧妙应用

二叉树的层序遍历是一种经典的遍历方式&#xff0c;它要求按层级逐层访问二叉树的节点。通常我们会使用队列来实现层序遍历&#xff0c;但递归法也是一种可行且有趣的思路。本文将深入探讨递归法解决二叉树层序遍历的核心难点&#xff0c;并结合代码和模拟过程进行详细讲解。 …...

电脑内存智能监控清理,优化性能的实用软件

软件介绍 Memory cleaner是一款内存清理软件。功能很强&#xff0c;效果很不错。 Memory cleaner会在内存用量超出80%时&#xff0c;自动执行“裁剪进程工作集”“清理系统缓存”以及“用全部可能的方法清理内存”等操作&#xff0c;以此来优化电脑性能。 同时&#xff0c;我…...

Chrome浏览器实验性API computePressure的隐私保护机制如何绕过?

一、computePressure API 设计原理与隐私保护机制 1.1 API 设计目标 computePressure是W3C提出的系统状态监控API,旨在: • 提供系统资源状态的抽象指标(非精确值) • 防止通过高精度时序攻击获取用户指纹 • 平衡开发者需求与用户隐私保护 1.2 隐私保护实现方式 // 典…...

​​开放传神创始人论道AI未来|“广发证券—国信中数人工智能赛道专家交流论坛“落幕

4月25日&#xff0c;“广发证券—国信中数人工智能赛道专家交流论坛”在广发证券大厦成功举办。本次论坛由广发证券股份有限公司与北京国信中数投资管理有限公司联合主办&#xff0c;汇聚了人工智能领域的50多位企业、行业专家、专业投资机构的精英代表&#xff0c;旨在搭建产学…...

MySQL八股(自用)

MySQL 定位慢查询 1.聚合查询 2.多表查询 3.表数据量过大查询 4.深度分页查询 MySQL自带慢日志 开启慢查询日志&#xff0c;配置文件&#xff08;/etc/my.cnf&#xff09; 开启慢日志&#xff0c;设置慢日志的时间 用EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信…...

2025年6月一区SCI-不实野燕麦优化算法Animated Oat Optimization-附Matlab免费代码

引言 近年来&#xff0c;在合理框架内求解优化问题的元启发式算法的发展引起了全球科学界的极大关注。本期介绍一种新的元启发式算法——不实野燕麦优化算法Animated Oat Optimization algorithm&#xff0c;AOO。该算法模拟了不实野燕麦的3种独特行为&#xff0c;于2025年6月…...

如何开发一款 Chrome 浏览器插件

Chrome是由谷歌开发的网页浏览器&#xff0c;基于开源软件&#xff08;包括WebKit和Mozilla&#xff09;开发&#xff0c;任何人都可以根据自己需要使用、修改或增强它的功能。Chrome凭借着其优秀的性能、出色的兼容性以及丰富的扩展程序&#xff0c;赢得了广大用户的信任。市场…...

UniApp 微信小程序绑定动态样式 :style 避坑指南

在使用 UniApp 开发跨端应用时&#xff0c;绑定动态样式 :style 是非常常见的操作。然而&#xff0c;很多开发者在编译为 微信小程序 时会遇到一个奇怪的问题&#xff1a; 原本在 H5 中可以正常渲染的样式&#xff0c;在微信小程序中却不生效&#xff01; 让我们通过一个示例来…...

基于OpenCV中的图像拼接方法详解

文章目录 引言一、图像拼接的基本流程二、代码实现详解1. 准备工作2. 特征检测与描述detectAndDescribe 函数详解&#xff08;1&#xff09;函数功能&#xff08;2&#xff09;代码解析&#xff08;3&#xff09;为什么需要这个函数&#xff1f;&#xff08;4&#xff09;输出数…...

【BUG】滴答定时器的时间片轮询与延时冲突

SysTick定时器实现延时与时间戳的深度分析与问题解决指南 1. SysTick基础原理 1.1 SysTick的功能与核心配置 SysTick是ARM Cortex-M内核的系统定时器&#xff0c;常用于以下场景&#xff1a; 时间戳&#xff1a;通过周期性中断记录系统运行时间&#xff08;如tick_ms计数器&…...

基于EFISH-SCB-RK3576/SAIL-RK3576的智能快递分拣机技术方案‌

&#xff08;国产化替代J1900的物流自动化解决方案&#xff09; 一、硬件架构设计‌ ‌高速视觉识别系统‌ ‌多目立体成像‌&#xff1a; 双MIPI-CSI接入16K线阵相机&#xff08;扫描速度5m/s&#xff09;&#xff0c;支持0.1mm级条形码破损识别NPU加速YOLOv7算法&#xff0…...

The 2022 ICPC Asia Xian Regional Contest(E,L)题解

E Find Maximum 题意&#xff1a; 首先&#xff0c;通过观察与打表&#xff0c;可以发现&#xff1a; 规律&#xff1a; 对于非负整数 x&#xff0c;函数 f(x) 的值等于&#xff1a; 将 xx 写成三进制后&#xff0c;各个位数的数字之和 该三进制数的位数。 例如&#xff0c…...

Jmeter 安装包与界面汉化

Jmeter 安装包&#xff1a; 通过网盘分享的文件&#xff1a;CSDN-apache-jmeter-5.5 链接: https://pan.baidu.com/s/17gK98NxS19oKmkdRhGepBA?pwd1234 提取码: 1234 Jmeter界面汉化&#xff1a;...

《Python星球日记》 第70天:Seq2Seq 与Transformer Decoder

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、Seq2Seq模型基础1. 什么是Seq2Seq模型?2. Encoder-Decoder架构详解1️⃣编码器(Encoder)2️⃣解码器(Decoder)3. 传统Seq2Seq模型的局限性…...

【Linux】基础指令(Ⅱ)

目录 1. mv指令 2. cat指令 3.echo指令 补&#xff1a;输出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 时间戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 语法&#xff1a;mv [选项]... 源文件/目录 目标文件/目录 …...

【Python3教程】Python3基础篇之输入与输出

博主介绍:✌全网粉丝23W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...

mysql的一个缺点

最近再移植一个从oracle转mysql的项目&#xff0c;喜提一个报错&#xff1a; You cant specify target table A016 for update in FROM clause 对应的程序代码&#xff1a; public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…...

【C/C++】高阶用法_笔记

1. 模板元编程&#xff08;TMP&#xff09;与编译时计算 (1) 类型萃取与 SFINAE 类型萃取&#xff08;Type Traits&#xff09;&#xff1a;利用模板特化在编译时推断类型属性。 template<typename T> struct is_pointer { static constexpr bool value false; };templ…...

AMS3xxi激光测距仪安装调试维护详解

一、应用原理介绍 如下图&#xff0c;AMS3xxi激光测距发出的激光通过特定反光板返回后&#xff0c;利用“时间飞行法”原理进行距离 测量。测量中若遮挡光束传播会导致测距失败&#xff0c;产品报警。 二、固定和调节位置说明 在安装板上&#xff0c;使用 4 个 M5 螺钉锁 AMS…...

建筑IT数字化突围:建筑设计企业的生存法则重塑

困局&#xff1a;铅笔与键盘的撕裂之痛 晨光中的设计院里&#xff0c;总工老张的办公桌上堆叠着三摞图纸&#xff1a;左边是刚收尾的住宅施工图&#xff0c;中间夹着结构专业提资的变更单&#xff0c;右边是甲方连夜发来的方案调整意见。这是他从业28年来的日常&#xff0c;也…...

VTK|类似CloudCompare的比例尺实现2-vtk实现

文章目录 实现类头文件实现类源文件调用逻辑关键问题缩放限制问题投影模式项目git链接实现类头文件 以下是对你提供的 ScaleBarController.h 头文件添加详细注释后的版本,帮助你更清晰地理解每个成员和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…...

Java高频面试之并发编程-17

volatile 和 synchronized 的区别 在 Java 并发编程中&#xff0c;volatile 和 synchronized 是两种常用的同步机制&#xff0c;但它们的适用场景和底层原理有显著差异。以下是两者的详细对比&#xff1a; 1. 核心功能对比 特性volatilesynchronized原子性不保证复合操作的原…...

最优化方法Python计算:有约束优化应用——近似线性可分问题支持向量机

二分问题的数据集 { ( x i , y i ) } \{(\boldsymbol{x}_i,y_i)\} {(xi​,yi​)}&#xff0c; i 1 , 2 , ⋯ , m i1,2,\cdots,m i1,2,⋯,m中&#xff0c;特征数据 { x i } \{\boldsymbol{x}_i\} {xi​}未必能被一块超平面按其标签值 y i ∈ { − 1 , 1 } y_i\in\{-1,1\} yi​∈…...

Excel中批量对多个结构相同的工作表执行操作,可以使用VBA宏来实现

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…...

Spring的Validation,这是一套基于注解的权限校验框架

为了保证数据的正确性、完整性&#xff0c;作为一名后端开发工程师&#xff0c;不能仅仅依靠前端来校验数据&#xff0c;还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器&#xff0c;处理校验异常 RestControllerAdvice p…...

鸿蒙OSUniApp 开发的下拉刷新与上拉加载列表#三方框架 #Uniapp

使用 UniApp 开发的下拉刷新与上拉加载列表 前言 最近在做一个小程序项目时&#xff0c;发现列表的加载体验对用户至关重要。简单的一次性加载全部数据不仅会导致首屏加载缓慢&#xff0c;还可能造成内存占用过大。而分页加载虽然解决了这个问题&#xff0c;但如果没有良好的…...

VastBase的日常操作记录

---------需要命令启动数据库操作------------------- [vastbasedmz-neo4j01 ~]$ vb_ctl start [2025-05-13 09:41:54.515][10224][][vb_ctl]: vb_ctl started,数据目录是 /home/vastbase/data/vastbase [2025-05-13 09:41:54.728][10224][][vb_ctl]: 等待服务端进程启动 ... …...