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

[C]基础14.字符函数和字符串函数

  • 博客主页:向不悔
  • 本篇专栏:[C]
  • 您的支持,是我的创作动力。

文章目录

  • 0、总结
  • 1、字符分类、转换函数
  • 2、strlen的使用和模拟实现
    • 2.1 strlen的使用
    • 2.2 strlen的模拟实现
  • 3、strcpy的使用和模拟实现
    • 3.1 strcpy的使用
    • 3.2 strcpy的模拟实现
  • 4、strcat的使用和模拟实现
    • 4.1 strcat的使用
    • 4.2 strcat的模拟实现
  • 5、strcmp的使用和模拟实现
    • 5.1 strcmp的使用
    • 5.2 strcmp的模拟实现
  • 6、strncpy函数的使用
  • 7、strncat函数的使用
  • 8、strncmp函数的使用
  • 9、strstr的使用和模拟实现
    • 9.1 strstr的使用
    • 9.2 strstr的模拟实现
  • 10、strtok函数的使用
  • 11、strerror函数的使用


0、总结

在这里插入图片描述

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,我们要学习一下这些函数。

1、字符分类、转换函数

C语言中有一系列的函数是专门做字符分类的,也就是说,一个字符是属于什么类型的字符。这些函数的使用都需要包含一个头文件是ctype.h,分类函数参考:https://cplusplus.com/reference/cctype/。

常用的分类函数如下:

  • isspace:空白字符,https://cplusplus.com/reference/cctype/isspace/
  • isdigit:十进制数字,https://cplusplus.com/reference/cctype/isdigit/
  • islower:小写字母a~z,https://cplusplus.com/reference/cctype/islower/
  • isupper:大写字母A~Z,https://cplusplus.com/reference/cctype/isupper/

转换函数的头文件也是ctype.h,参考如下:

  • tolower:大写转小写,https://cplusplus.com/reference/cctype/tolower/
  • toupper:小写转大写,https://cplusplus.com/reference/cctype/toupper/

示例,写一个代码,将字符串中的小写字母转大写,其他字符不变。

#include <stdio.h> /* printf */
#include <ctype.h> /* islower、toupper */
#include <string.h> /* strlen */int main()
{char str[] = "hello,world";int len = strlen(str);int i = 0;for (i = 0; i < len; i++){if (islower(str[i])) str[i] = toupper(str[i]);}printf("%s\n", str);return 0;
}

2、strlen的使用和模拟实现

2.1 strlen的使用

介绍:

  • 头文件:string.h
  • 函数原型:size_t strlen(const char* str);
  • 作用:计算字符串的长度
  • 参考:https://cplusplus.com/reference/cstring/strlen/

总结如下:

  • 字符串以'\0',作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数,不包含'\0'
  • 参数指向的字符串必须要以'\0'结束。
  • 注意函数的返回值为size_t,是无符号的(易错)。

2.2 strlen的模拟实现

方式一:计数器方式

#include <stdio.h> /* printf */
#include <assert.h>int my_strlen(const char* str)
{int count = 0;// 如果str是空指针,程序会输出一条错误的信息并终止执行。// 因为如果直接对空指针进行解引用,会导致程序崩溃。assert(str);// 循环一直执行,直到str指向的字符是空字符\0。while (*str){count++;str++;}return count;
}int main()
{const char* str = "abc";int len = my_strlen(str);printf("%d\n", len);return 0;
}

方式二:不能创建临时变量计数器

int my_strlen(const char* str)
{assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}

方式三:指针-指针的方式

int my_strlen(const char* str)
{assert(str);char* p = str;while (*p)p++;return p - str;
}

3、strcpy的使用和模拟实现

3.1 strcpy的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strcpy(char* destination, const char* source);
  • 作用:拷贝字符串到目标空间
  • 参考:https://cplusplus.com/reference/cstring/strcpy/

总结如下:

  • 源字符串必须以'\0'结束。
  • 会将源字符串中的'\0'拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。

3.2 strcpy的模拟实现

题目出自《高质量C/C++编程》书籍最后的试题部分

#include <stdio.h> /* printf */
#include <assert.h>char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest);assert(src);// 赋值后的结果(即*src的值作为条件)// 当*src为'\0'时候,条件为假,循环结束。// 就是说,先获取*src的值,再将这个值赋给*dest,用这个值(即*src的值)作为循环的条件。while (*dest++ = *src++);return ret;
}int main()
{char a[30] = "xxxxxxxx";char b[4] = "abc";printf("复制前:%s\n", a);my_strcpy(a, b);printf("复制后:%s\n", a);return 0;
}

解释while (*dest++ = *src++);,如下:

4、strcat的使用和模拟实现

4.1 strcat的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strcat(char* destination, const char* source);
  • 作用:追加目标字符串
  • 参考:https://cplusplus.com/reference/cstring/strcat/

总结如下:

  • 源字符串必须以’\0’结束。
  • 目标字符串中也得有’\0’,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的大,且必须可修改。
  • 字符串自己给自己追加,如何?

4.2 strcat的模拟实现

#include <stdio.h> /* printf */
#include <assert.h>char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest);assert(src);while (*dest) dest++;while (*dest++ = *src++);return ret;
}int main()
{char a[30] = "xxxxxxxx";char b[4] = "abc";printf("复制前:%s\n", a);my_strcat(a, b);printf("复制后:%s\n", a);return 0;
}

my_strcat函数在将字符串自己追加自己时会导致无限循环,可能引发程序崩溃。

5、strcmp的使用和模拟实现

5.1 strcmp的使用

介绍:

  • 头文件:string.h
  • 函数原型:int strcmp(const char* str1, const char* str2);
  • 作用:比较字符串的大小
  • 参考:https://cplusplus.com/reference/cstring/strcmp/

总结如下:

  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。
  • 是如何判断两个字符串呢?比较两个字符串中对应位置上字符ASCII码值的大小。

5.2 strcmp的模拟实现

#include <stdio.h> /* printf */
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){// if (*str1 == '\0') 和 if (*str2 == '\0') 在逻辑上是等价的,// 因为当两个字符串相等时,它们会同时到达末尾(即遇到'\0')。if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

6、strncpy函数的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strncpy(char* destination, const char* source, size_t num);
  • 作用:拷贝num个字符从源字符串到目标空间
  • 参考:https://cplusplus.com/reference/cstring/strncpy/

注意:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

7、strncat函数的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strncat(char* destination, const char* source, size_t num);
  • 作用:将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个\0字符。
  • 参考:https://cplusplus.com/reference/cstring/strncat/

注意:如果source指向的字符串的长度小于num的时候,只会将字符串中到\0的内容追加到destination指向的字符串末尾。

8、strncmp函数的使用

介绍:

  • 头文件:string.h
  • 函数原型:int strncmp(const char* str1, const char* str2, size_t num);
  • 作用:比较str1和str2的前num个字符
  • 参考:https://cplusplus.com/reference/cstring/strncmp/

9、strstr的使用和模拟实现

9.1 strstr的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strstr(const char*, const char*);
  • 作用:函数返回字符串str2在字符串str1中第一次出现的位置。
  • 参考:https://cplusplus.com/reference/cstring/strstr/

注意:字符串的比较匹配不包含\0字符,以\0作为结束标志。

9.2 strstr的模拟实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>char* my_strstr(const char* str1, const char* str2)
{char* cp = (char*)str1;char* s1, * s2;if (!*str2)return (char*)str1;while (*cp){s1 = cp;s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;if (!*s2)return cp;cp++;}return NULL;
}int main()
{char s1[] = "aaabbbcccdefbbcdefa";char s2[] = "ccdef";printf("%s\n", my_strstr(s1, s2));return 0;
}

10、strtok函数的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strtok(char* str, const char* delimiters);
  • 作用:分割字符串
  • 参考:https://cplusplus.com/reference/cstring/strtok/

总结如下:

  • delimiters参数指向一个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或者多个由delimiters字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL指针。

示例:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "192.168.6.111";char* sep = ".";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}
运行:
192
168
6
111

11、strerror函数的使用

介绍:

  • 头文件:string.h
  • 函数原型:char* strerror(int errnum);
  • 作用:将错误码转换为对应的错误信息字符串地址。
  • 参考:https://cplusplus.com/reference/cstring/strerror/

总结如下:

函数能返回对应错误码的错误信息字符串地址。系统和 C 语言标准库规定了一些错误码,一般在头文件中说明。程序启动时用变量记录当前错误码,初始为 0 表示无错误。调用标准库函数出错时,会将对应错误码存入因错误码是整数较难理解,所以每个错误码都有对应的错误信息,函数就能返回该错误信息字符串的地址。

打印0~10这些错误码对应的信息

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("%s\n", strerror(i));}return 0;
}
在Windows11+VS2022环境下输出运行:
No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes

举个例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pFile;pFile = fopen("1.txt", "r");if (pFile == NULL)printf("Error:%s\n", strerror(errno));return 0;
}
运行:
Error:No such file or directory

也可以了解perror函数,总结如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pFile;pFile = fopen("1.txt", "r");if (pFile == NULL)perror("Error 1.txt");return 0;
}
运行:
Error 1.txt: No such file or directory

所以,perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。


完。

相关文章:

[C]基础14.字符函数和字符串函数

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、字符分类、转换函数2、strlen的使用和模拟实现2.1 strlen的使用2.2 strlen的模拟实现 3、strcpy的使用和模拟实现3.1 strcpy的使用3.2 strcpy的模拟实现 4、strcat…...

三种机器学习类型

本文讲介绍三种机器学习类型&#xff1a;①监督学习&#xff0c;②无监督学习&#xff0c;③强化学习。我们主要了解监督学习和无监督学习即可。 下图介绍这三种机器学习类型的区别&#xff1a; 1 用来预测未来的监督学习 从有标签的训练数据中学习一个模型&#xff0c;用来…...

UE5 Set actor Location和 Set World Location 和 Set Relative Location 的区别

在 Unreal Engine 的蓝图里&#xff0c;SetRelativeLocation、SetWorldLocation 和 SetActorLocation 三个节点虽然都能改变物体位置&#xff0c;但作用对象和坐标空间&#xff08;Coordinate Space&#xff09;不同&#xff1a; 1. SetActorLocation 作用对象&#xff1a;整个…...

Glide 如何加载远程 Base64 图片

最近有个需求&#xff0c;后端给出的图片地址并不是正常的 URL&#xff0c;而且需要一个接口去请求&#xff0c;但是返回的是 base64 数据流。这里不关心为啥要这么多&#xff0c;原因有很多&#xff0c;可能是系统的问题&#xff0c;也可能是能力问题。当然作为我们 Android 程…...

JVM对象存储格式

引言 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;对象的内存布局是一个重要的底层概念&#xff0c;它直接影响对象在内存中的存储方式和占用空间。了解对象存储格式不仅有助于优化程序性能&#xff0c;还能帮助我们更好地理解JVM的工作原理。本文将详细探讨对象存…...

3D Gaussian Splatting部分原理介绍和CUDA代码解读

本系列旨在帮助无CUDA代码经验的读者、以及3DGS的初学者理解代码逻辑。 3D GS论文原文链接&#xff1a;https://arxiv.org/abs/2308.04079 论文笔记链接&#xff1a;【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering 【论文笔记】A Survey on 3D Ga…...

日本IT行业|salesforce开发语言占据的地位

在日本的IT行业中&#xff0c;Salesforce 开发语言处于一个较为专业但稳步增长的细分领域&#xff0c;并不是主流开发语言&#xff08;如 Java、Python、PHP&#xff09;&#xff0c;但其在某些行业和场景中地位越来越重要。 本篇以下是详细分析&#xff1a; Salesforce开发语言…...

1.1 点云数据获取方式——引言

图1-1-1点云建筑场景图 点云数据是指能够描述外部场景、对象表面的三维空间位置&#xff0c;并具有相关属性的点集&#xff0c;其每个离散点通常包括三维空间位置&#xff08;x,y,z&#xff09;以及强度、颜色等属性信息。大量分布的离散点集能够清晰而直接地描绘场景、对象的3…...

接入层架构演变

1、单体架构 请求过程 浏览器的请求通过 DNS Server 解析到指定的 IP 地址&#xff0c;浏览器通过 IP 地址访问 Web Server 缺点 当到达 Web Server 的性能瓶颈时&#xff08;瓶颈受到CPU&#xff0c;内存&#xff0c;io&#xff0c;带宽影响&#xff09;&#xff0c;无法进…...

python:sklearn 主成分分析(PCA)

参考书&#xff1a;《统计学习方法》第2版 第16章 主成分分析&#xff08;PCA&#xff09;示例 编写 test_pca_1.py 如下 # -*- coding: utf-8 -*- """ 主成分分析&#xff08;PCA&#xff09; """ import matplotlib.pyplot as plt from skl…...

力扣-数据结构-二叉树

94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#x…...

嵌入式音视频实时通话EasyRTC打造设备安装与调试的高效远程解决方案

一、背景 在数字化浪潮席卷全球的今天&#xff0c;实时音视频通信技术已经成为众多领域不可或缺的重要组成部分。从智能家居到智能安防&#xff0c;从在线教育到远程医疗&#xff0c;人们对于高效、便捷、稳定且低延迟的音视频通信解决方案的需求日益迫切。而EasyRTC作为一款卓…...

AI 的未来是开源?DeepSeek 正在书写新篇章!

AI 的未来是开源&#xff1f;DeepSeek 正在书写新篇章&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;越来越多的企业和研究机构开始关注 AI 的开放性和透明度。开源不仅能够促进技术创新&#xff0c;还能加速知识的传播和应用。在这个背景下…...

抢先体验全新极小大模型Qwen3:0.6B

全民都在期待DeepSeek-R2的发布,但是一不小心被阿里截胡了,2025 年 4 月 29 日,阿里巴巴发布并开源了通义千问 Qwen3 系列大模型。据 大模型镜像网站 上关于Qwen3的介绍: Qwen3 是 Qwen 系列中最新一代的大型语言模型,提供一整套密集模型和混合专家 (MoE) 模型。Qwen3 基…...

部署一个自己的Spring Ai 服务(deepseek/通义千问)

Spring Boot 无缝接入 DeepSeek 和通义千问请求日志记录及其ip黑白名单 SpringBoot版本 3.2.0 JDK 版本为17 redis 3.2.0 mybatis 3.0.3 依赖引入 关键依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-sp…...

第一讲 | 算法复杂度

算法复杂度 一、数据结构前言1、数据结构&#xff08;DS&#xff09;2、算法&#xff08;Algorithm&#xff09; 二、算法效率1、复杂度的概念 三、时间复杂度&#xff08;1&#xff09;、案例&#xff08;2&#xff09;、大O的渐进表示法&#xff08;3&#xff09;、时间复杂度…...

【运维】还原 Docker 启动命令的利器:runlike 与 docker-autocompose

&#x1f50d; 还原 Docker 启动命令的利器&#xff1a;runlike 与 docker-autocompose 实用教程 在日常使用 Docker 时&#xff0c;我们常常通过 docker run 启动容器&#xff0c;但有时候过了一段时间就忘记了当初使用的具体参数&#xff08;端口、挂载、环境变量等&#xf…...

IP属地是实时位置还是自己设置

刷微博、抖音时&#xff0c;评论区总能看到“IP属地”&#xff1f;这个突然冒出来的小标签&#xff0c;让不少网友摸不着头脑&#xff1a;‌IP属地是实时位置&#xff0c;还是可以自己设置&#xff1f;‌别急&#xff0c;今天咱们就来聊聊这个话题&#xff01; 1、什么是IP属地…...

Android WIFI体系

先说说WifiLock、MulticastLock 、IWificond WifiLock 允许应用强制保持 WiFi 活跃&#xff0c;即便设备处于休眠状态。如WIFI_MODE_FULL_HIGH_PERF&#xff1a;保持高性能 WiFi 活跃状态&#xff0c;适用于高带宽需求&#xff0c;如视频通话、流媒体。经测试有的场景能减少10…...

什么是静态住宅ip,跨境电商为什么要用静态住宅ip

在数字时代&#xff0c;IP地址不仅是设备联网的“ID”&#xff0c;更是跨境电商运营中的关键工具。尤其对于需要长期稳定、安全操作的场景&#xff0c;静态住宅IP逐渐成为行业首选。 一、什么是静态住宅IP&#xff1f; 静态住宅IP&#xff08;Static Residential IP&#xff0…...

常见位运算总结

目录 常见位运算总结 191:位1的个数 338&#xff1a;比特位计数 461:汉明距离 136&#xff1a;只出现一次的数字 260&#xff1a;只出现一次的数字III 常见位运算总结 191:位1的个数 链接&#xff1a;191. 位1的个数 - 力扣&#xff08;LeetCode&#xff09; class Sol…...

[密码学实战]SDF之对称运算类函数(四)

[密码学实战]SDF之对称运算类函数(四) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-1jptduZFNFiRZ2lS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...

【C++编程入门】:基本语法

上一篇提到了C关键字和缺省参数以及命名空间域&#xff0c;这篇继续分享C入门语法&#xff0c;把基本语法掌握扎实后面学习更才能更轻松一些。 目录 引用 引用的特性 常引用 内联函数 auto关键字 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&am…...

区块链最佳框架:Truffle vs Hardhat vs Brownie

区块链技术的快速发展使得智能合约开发成为主流&#xff0c;而选择合适的开发框架是提升效率的关键。目前&#xff0c;Truffle、Hardhat和Brownie是三大主流框架&#xff0c;它们各有特点&#xff0c;适用于不同的开发场景和开发者偏好。本文将从功能、生态系统、适用人群等角度…...

Apache Flink的架构设计与运行流程说明

在大数据领域&#xff0c;实时计算的重要性随着业务需求的爆发式增长愈发凸显。从电商的实时销量监控到金融的高频交易风控&#xff0c;从物联网设备的实时告警到社交平台的热点追踪&#xff0c;企业对“秒级甚至毫秒级”数据处理能力的需求已成为刚需。在众多实时计算框架中&a…...

AI+零售:智能推荐、无人店与供应链管理的未来

AI零售&#xff1a;智能推荐、无人店与供应链管理的未来 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI零售&#xff1a;智能推荐、无人店与供应链管理的未来摘要引言一、智能推荐系统&#xff1a;从流量收割到用…...

华为云IoT平台与MicroPython实战:从MQTT协议到物联网设备开发

目录 前言 1. 华为云 1.1. 创建实例 1.2. 创建产品 1.3. 编辑服务模型 1.4. 注册设备 1.4.1. 复制设备连接参数 1.5. 连接参考代码 2. micropython版-物联网 2.1. 环境搭建 2.2. 实现步骤 2.3. 示例代码 结语 前言 物联网&#xff08;IoT&#xff09;技术的快速发…...

【Linux】Linux内核模块开发

Linux内核模块开发 零、关于 1、概述 最近在学习Linux相关的东西&#xff0c;学习了U-Boot的编译&#xff0c;Linux的编译&#xff0c;能够在开发板上运行自己编译的U-Boot和Linux了&#xff0c;那么接下来就是在自己编译的Linux上做应用级或者系统级的开发了。本文以字符设…...

linux 下查看指定进程的内存CPU占用情况(用于程序崩溃类的排查)

在程序开发过程中&#xff0c;如果程序较为庞大&#xff0c;逻辑较为复杂时&#xff0c;容易出现运行时崩溃的问题。导致的原因有很多&#xff0c;我这里只对较为通用的内容占用情况作记录&#xff0c;如程序中对文件描述符打开未关闭&#xff08;导致fd积攒过多超过了系统的标…...

ASP.NET MVC​ 入门指南五

26. 响应式设计与移动开发 26.1 响应式视图设计 为了使 MVC 应用程序在不同设备上都能提供良好的用户体验&#xff0c;需要采用响应式设计。可以使用 CSS 框架如 Bootstrap 来实现响应式布局。 引入 Bootstrap&#xff1a;在项目中引入 Bootstrap 的 CSS 和 JavaScript 文件。…...

字节跳动社招面经 —— BSP驱动工程师(4)

接前一篇文章&#xff1a;字节跳动社招面经 —— BSP驱动工程师&#xff08;3&#xff09; 本文内容参考&#xff1a; 嵌入式硬件平台修改启动地址-CSDN博客 特此致谢&#xff01; 上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题…...

Spring MVC中自定义日期类型格式转换器

在Spring MVC中&#xff0c;自定义日期类型格式转换器可以通过实现Converter接口或使用DateTimeFormat注解。以下是两种方法的详细说明&#xff1a; 方法一&#xff1a;全局自定义转换器&#xff08;推荐&#xff09; 1. 创建日期转换器类 实现 org.springframework.core.con…...

【3D 地图】无人机测绘制作 3D 地图流程 ( 无人机采集数据 | 地图原始数据处理原理 | 数据处理软件 | 无人机测绘完整解决方案 )

文章目录 一、无人机采集数据1、多角度影像数据2、定位与姿态数据 二、无人机采集数据处理原理1、空三解算2、密集点云生成与三维重建3、地形与正射影像生成4、三维模型优化与瓦片化 三、无人机影像处理软件介绍 一、无人机采集数据 无人机原始数据采集 : 多角度影像数据 : 多…...

arduino Nano介绍

【仅供学习&#xff0c;具体参数参考官网或销售商】 Arduino Nano 是一款基于 ATmega328P 微控制器&#xff08;或 ATmega168 旧版&#xff09;的紧凑型开发板&#xff0c;专为嵌入式项目和原型设计而设计。 以下是Arduino Nano V3.0 328P详细介绍&#xff1a; 主要特性 微…...

解决 Flutter 在 iOS 真机上构建失败的问题

在开发 Flutter 应用时&#xff0c;有时会在尝试将应用部署到 iOS 真机时遇到构建失败的问题。错误信息通常类似于以下内容&#xff1a; Could not build the precompiled application for the device. Uncategorized (Xcode): Timed out waiting for all destinations matchi…...

【办公类-89-03】20250429AI写的研讨记录,清除格式,统一格式,名字替换。部分加粗,添加页眉

背景需求: 检查自即,需要AI一下院内的五次科研培训记录。 本次用了豆包 豆包写的不错,也是“水字数”的高手 把每次培训内容贴到WORD里 把AI资料贴到WORD里,发现问题: 1、字体、段落什么都是不统一的,需要统一改成宋体小四,1.5倍行距 2、十个研讨人也要改成真人。就找…...

react-native 安卓APK打包流程

一、使用keytool命令生成一个签名密钥 $ keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 在 Windows 上keytool命令放在 JDK 的 bin 目录中&#xff08;比如C:\Program Files\…...

Android Studio中OpenCV应用详解:图像处理、颜色对比与OCR识别

文章目录 一、OpenCV在Android中的集成与配置1.1 OpenCV简介1.2 在Android Studio中集成OpenCV1.2.1 通过Gradle依赖集成1.2.2 通过模块方式集成1.2.3 初始化OpenCV 1.3 OpenCV基础类介绍 二、指定区域图像抓取与对比2.1 图像抓取基础2.2 指定区域图像抓取实现2.2.1 从Bitmap中…...

企业办公协同平台安全一体化生态入住技术架构与接口标准分析报告

全球组织数字化与智能化背景下 企业办公协同平台安全一体化生态入住技术架构与接口标准分析报告 一、背景与市场需求 市场规模与增量 根据Statista数据&#xff0c;全球协同办公平台市场规模预计从2023年的$480亿增长至2027年的$900亿&#xff0c;年复合增长率&#xff08;CAG…...

从零搭建体育比分网站:技术选型与API调用实战(附完整源码)

一、前言&#xff1a;为什么选择体育比分项目&#xff1f; 体育数据网站是练手全栈开发的绝佳项目&#xff0c;涉及&#xff1a; ✅ 前端&#xff08;实时数据渲染、可视化图表&#xff09; ✅ 后端&#xff08;API对接、数据缓存、高并发优化&#xff09; ✅ 数据库&#xff…...

非凸科技受邀出席AI SPARK活动,共探生成式AI驱动金融新生态

4月19日&#xff0c;由AI SPARK社区主办的“生成式AI创新与应用构建”主题沙龙在北京举行。活动聚焦生成式AI的技术突破与产业融合&#xff0c;围绕大模型优化、多模态应用、存内计算等前沿议题展开深度探讨。非凸科技受邀出席并发表主题演讲&#xff0c;深入解析金融垂直大模型…...

深入蜂窝物联网 第五章 EC-GSM-IoT 及其他技术:混合组网与前瞻

1. 前言与应用场景 在一些地区,GSM 网络仍然大面积覆盖且运营成本低廉,运营商可通过 EC-GSM-IoT(Extended Coverage GSM for IoT)在现有GSM基站上升级,实现物联网互联。同时,为了满足不同场景的需求,常常需要与 NB-IoT、LTE-M、5G RedCap 等技术混合组网,形成多层次、…...

2025年深圳软件开发公司推荐

随着移动互联网的深度发展&#xff0c;软件开发已成为企业实现数字化转型的重要途径。作为中国科技创新中心的深圳&#xff0c;汇聚了众多技术实力雄厚的软件开发企业。本文将为您精选推荐6家在深圳表现突出的软件开发服务商&#xff0c;帮助企业找到合适的数字化转型合作伙伴。…...

仿腾讯会议——注册登录UI

1、加载素材 2、新添加资源类 3、加载图片 4、添加左侧图片 在左侧添加一个标签 选择图片 选择图片 勾选保证图片不变形 5、修改组件名称 6、设置密码输入框 5、切换 6、编辑提示框 7、定义提交和清空的槽函数 8、设置页面标题和最先显示页面 9、清空登录信息函数实现 10、清空…...

香港科技大学广州|可持续能源与环境学域博士招生宣讲会—四川大学专场

香港科技大学广州&#xff5c;可持续能源与环境学域博士招生宣讲会—四川大学专场 时间&#xff1a;2025年5月8日&#xff08;星期四&#xff09;16:30开始 地点&#xff1a;四川大学基础教学楼A座504 宣讲嘉宾&#xff1a;肖殿勋 助理教授 一经录取&#xff0c;享全额奖学金…...

设计模式(工厂模式)

工厂设计模式&#xff1a;打造你的代码生产线 引言 想象一下&#xff0c;你正站在一家现代化的玩具工厂门前。工厂内部&#xff0c;各种机器有条不紊地运转&#xff0c;原材料在传送带上流动&#xff0c;最终变成精美的玩具。你不需要了解每个玩具的具体制作工艺&#xff0c;…...

本地大模型编程实战(29)查询图数据库NEO4J(2)

上一篇文章 用大语言模型LLM查询图数据库NEO4J(1) 介绍了使用GraphQACypherChain查询NEO4J。用它实现简单快捷&#xff0c;但是不容易定制&#xff0c;在生产环境中可能会面临挑战。 本文将基于langgraph 框架&#xff0c;用LLM(大语言模型)查询图数据库NEO4J。它可以定义清晰复…...

Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南

目录 一、为什么需要文档型数据库&#xff1f;1.1 数据存储的范式变革1.2 pymongo的核心优势 二、pymongo核心操作全解析2.1 环境准备2.2 数据库连接与CRUD操作2.3 聚合管道实战2.4 分批次插入百万级数据&#xff08;进阶&#xff09;2.5 分批次插入百万级数据&#xff08;进阶…...

从遍历序列构造二叉树:前序+中序与中序+后序的递归解法详解

文章目录 1. 问题背景2. 核心思路3. 从前序与中序遍历序列构造二叉树3.1 递归分治思路3.2 代码实现与注释 4. 从中序与后序遍历序列构造二叉树4.1 递归分治思路4.2 代码实现与注释 5. 复杂度分析6. 总结 1. 问题背景 二叉树的遍历方式包括前序&#xff08;根-左-右&#xff09…...

数据挖掘专栏介绍:用 Python + 大语言模型 (LLM) 重塑电商数据价值

写在前面 —— 不止于挖掘,更要智能涌现:用 Python + 大语言模型 (LLM) 重塑电商数据价值 或许你已经跟随我们之前的 “零基础上手Python数据分析” 专栏,掌握了 Pandas 的数据操纵、Matplotlib/Seaborn 的可视化呈现,甚至对传统的数据挖掘技术如聚类、分类、回归有了初步…...