字符串函数与内存函数讲解
文章目录
- 前言
- 一、字符串函数
- 1.求字符串长度
- strlen
- 2.长度不受限制的字符串函数
- (1)strcpy
- (2)strcat
- (3)strcmp
- 3.长度受限制的字符串函数
- (1)strncpy
- (2)strncat
- (3)strncmp
- 4.字符串查找
- (1)strstr
- (2)strtok
- 5.错误信息报告
- (1)strerror
- (2)perror
- 二、内存函数
- 1.memcpy
- 2.memmove
- 3.memset
- 4.memcmp
前言
一、字符串函数
1.求字符串长度
strlen
1、功能:求字符串长度
2、使用:
(1)介绍:
说明:
a.返回类型是size_t,也就是无符号整形(只有正数没有负数)
b.参数是char* 类型;加入const修饰是为了防止对str中存放的内容进行修改
c.字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )
(2)头文件:<string.h>
(3)举例:
a.
int main() {char arr1[] = "abcdefg";size_t len1 = strlen(arr1);return 0;
}
解析:
(1)strlen函数做需要的参数是char* 类型,所以创建了一个char类型的数组
(2在不是sizeof(数组名)与 &数组名 的情况下,数组名代表数组首元素的地址,首元素地址的类型是char*
(3)strlen 函数的返回值是size_t类型,也就是无符号的整形,所以我们设置一个相应类型的值来接收它
b.
int main() {char* arr2 = "abcdef";size_t len2 = strlen(arr2);size_t len3 = strlen("abcdef");printf("%d %d\n",len2,len3);return 0;
}
结果:
解析:
这里的len2和len3的最后结果其实是一致的,因为len3中的字符串其实传输的也是首元素的地址,属于char*类型,与len2中的传输的值是一样的
c.
int main() {char* arr3 = "abc\0def";char* arr4 = "abcde\0f";size_t len3 = strlen(arr3);size_t len4 = strlen(arr4);printf("%d %d\n", len3, len4);return 0;
}
结果:
解析:
strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )
(4)注意事项:
a.参数指向的字符串必须要以 ‘\0’ 结束。
b.注意函数的返回值为size_t,是无符号的
3、模拟实现:
方法一:
size_t my_strlen(const char* str) {//计录字符串长度size_t count = 0;//当*str='\0'是停止while (*str) {count++;str++;}return count;
}int main() {char arr1[] = "abcdefg";size_t len1 = my_strlen(arr1);printf("%d\n",len1);return 0;
}
#emsp;方法二
//递归实现
size_t my_strlen(const char* str) {if (*str == '\0') {return 0;}//这里不能使用后置++,因为它是先使用后++return 1 + my_strlen(str+1);
}int main() {char arr1[] = "abcdefg";size_t len1 = my_strlen(arr1);printf("%d\n", len1);return 0;
}
方法三:
//指针实现
size_t my_strlen(const char* str) {//创建一个临时变量来接收strchar* p = str;//对临时变量进行操作更加安全while (*p != '\0') {p++;}//字符串中有几个字符,p就会往后移动几位return p - str;
}int main() {char arr1[] = "abcdefg";size_t len1 = my_strlen(arr1);printf("%d\n", len1);return 0;
}
2.长度不受限制的字符串函数
(1)strcpy
1、功能:字符串拷贝
2、使用:
(1)介绍:
说明:
a.参数有两个,都是char* 类型:拷贝源与目的地
b.返回值是char* 类型,返回目的地的地址
c.头文件:<string.h>
(2)注意:
a.源字符串必须以 ‘\0’ 结束,,因为它是拷贝结束的标志,没有的话会一直拷贝,会越界访问
b.会将源字符串中的 ‘\0’ 拷贝到目标空间。
c.目标空间必须足够大,以确保能存放源字符串。
d.目标空间必须可变。
(3)举例:
a.
int main() {char arr1[20];char arr2[] = "abcdef";printf("%s\n",arr1);strcpy(arr1,arr2);printf("%s\n",arr1);return 0;
}
结果:
解析:
未对arr1进行初始化化,所以刚开始赋予的是随机值;在strcpy函数后,为其拷贝了值
3、模拟实现
char* my_strcpy(char* dest,const char* src) {//设置一个指针来存储目的地的起始地址char* ret = dest;//设置断言,防止对空指针解引用assert(src && dest);//对dst赋值,当赋值'\0'后不满足条件,退出循环while (*dest++ = *src++) {;}return ret;
}int main() {char arr1[20];char arr2[] = "abcdef";my_strcpy(arr1,arr2);printf("%s\n",arr1);return 0;
}
(2)strcat
1、功能:字符串追加
2、使用:
(1)介绍:
说明:
a.参数有两个,char*类型:源和目的地
b.返回的是目的地的起始地址
c.本函数是寻找目的地中的’\0’,从’\0’处开始追加源中的字符,并将原来的’\0’替换,将自己的’\0’拷贝过去
(2)注意:
a.必须保证目标空间要足够大
b.目标空间中必须有\0(保证能找到目标空间的末尾)
c.原字符串也得有\0,在拷贝时将\0也拷过去
d.目标空间必须可以修改
(3)举例:
int main() {char arr1[20] = "abcd";char arr2[] = "efgh";strcat(arr1,arr2);printf("%s\n",arr1);return 0;
}
结果:
3、模拟实现
char* my_strcat(char* dest,const char* src) {char* ret = dest;assert(dest && src);while (*dest) {dest++;}while ((*dest++ = *src++)) {;}return ret;
}int main() {char arr1[20] = "abcd";char arr2[] = "efgh";my_strcat(arr1,arr2);printf("%s\n",arr1);return 0;
}
(3)strcmp
1、功能:字符串比较
2、使用:
(1)介绍:
说明:
a.参数有两个,是比较的两个数组
b.当字符串1>字符串2时,返回一个>0的数
当字符串1=字符串2,返回一个<0的数
当字符串1<字符串2时,返回一个<0的数
c.两字符串比较的其实是每个字符的ASCII码值
(2)注意:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
(3)举例:
int main() {char arr1[] = "abbc";char arr2[] = "abcd";int ret = strcmp(arr1,arr2);printf("%d\n",ret);return 0;
}
3、模拟实现
int my_strcmp(const char* arr1,const char* arr2) {assert(arr1 && arr2);while (*arr1 == *arr2) {arr1++;arr2++;if (*arr1 == '\0') {return 0;}}if (*arr1 > *arr2)return 1;if (*arr1 < *arr2)return -1;
}int main() {char arr1[] = "abbc";char arr2[] = "abcd";int ret = my_strcmp(arr1,arr2);printf("%d\n",ret);return 0;
}
3.长度受限制的字符串函数
(1)strncpy
1、功能:限制数量的字符串拷贝
2、使用:
(1)介绍:
说明:多了一个数量限制,其余的与函数strcpy一致
(2)注意:
a.当源字符串中的字符数没有达到参数的数量时,会在目的地中自动补’\0’,直到达到限定数量
b.目的地的大小应该比限定数量大,否则就会非法访问
(3)举例:
a.
int main() {char arr1[10];char arr2[] = "abcdefg";strncpy(arr1,arr2,10);printf("%s\n",arr1);return 0;
}
结果:
(2)strncat
1、功能:限制数量的字符串追加
2、使用:
(1)介绍:
说明:多了一个数量限制,其余与函数strcat一致
(2)注意:
与函数strcat一致
(3)举例:
a.
int main() {char arr1[20] = "bcc";char arr2[] = "abcdefg";strncat(arr1, arr2, 10);printf("%s\n", arr1);return 0;
}
结果:
(3)strncmp
1、功能:限制数量的字符串比较
2、使用:
(1)介绍:
(3)举例:
a.
int main() {char arr1[] = "abc";char arr2[] = "abcdefg";int ret = strncmp(arr1, arr2, 4);printf("%d\n", ret);return 0;
}
结果:
4.字符串查找
(1)strstr
1、功能:字符串查找
2、使用:
(1)介绍:
说明:
a.有两个参数都是char类型,在str1中查找是否有str2中的字符串
b.返回值是char 类型,返回的是str1中查找的字符串的首地址
(2)注意:
a.如果字符串中有两个查找的字符串,会默认返回第一个找到的字符串的首地址
b.查找不到时会返回Null值
c.查找过程中碰到’\0’就会停止
(3)举例:
a.
int main() {char arr1[] = "abccbcccf";char arr2[] = "bccc";char * ret = strstr(arr1, arr2);printf("%s\n", ret);return 0;
}
结果:
b.
int main() {char arr1[] = "abccbcccf";char arr2[] = "g";char * ret = strstr(arr1, arr2);printf("%s\n", ret);return 0;
}
结果:
c.
int main() {char arr1[] = "abc\0bcccf";char arr2[] = "bccc";char * ret = strstr(arr1, arr2);printf("%s\n", ret);return 0;
}
结果:
3、模拟实现
const char* my_strstr(const char* str1,const char* str2) {//创建一个临时变量作为查找元素时的定位符const char* p = str1;const char* s1;const char* s2;assert(str1 && str2);while (*p) {//每次都从p处开始比较s1 = p;//如果没有完全找到,就要重头开始找s2 = str2;//不相等或者任意一方为'\0'时停止while ((*s1 && *s2 && *s1 == *s2)) {s1++;s2++;}//判断是否全部找到if (*s2 == '\0') {return p;}p++;}return NULL;
}int main() {char arr1[] = "abccbcccf";char arr2[] = "bc";char * ret = my_strstr(arr1, arr2);printf("%s\n", ret);return 0;
}
(2)strtok
1、功能:字符串分隔
2、使用:
(1)介绍:
说明:
a.有两个参数,都是char类型,第一个是等待分割的字符串,第二个是分隔符
b.返回值是charl类型,返回分隔后的字符串的首地址
(2)注意:
a.每次调用只会对字符串进行一次分隔
b.函数strtok会记住上一次分隔的结束位置,从那个位置开始进行下一次分割,但此次不能为它传输新的字符串指针,只能传输分隔符
(3)举例:
a.
int main() {char arr1[] = "abc@de.fg@h";char* d = "@.";char* ret = strtok(arr1, d);printf("%s\n", ret);return 0;
}
结果:
b.
int main() {char arr1[] = "abc@de.fg@h";char* d = "@.";for (char* ret = strtok(arr1, d); ret != NULL; ret = strtok(NULL, d)) {printf("%s\n",ret);}return 0;
}
结果:
5.错误信息报告
(1)strerror
1、功能:错误信息反馈
2、使用:
(1)介绍:
a.头文件<errno.h>
b.参数是int类型,是错误所对应的错误码
c.返回值是char* 类型,返回错误码,所对应的错误信息
(2)注意:
a.当程序产生错误时,会自动将错误码放入错误信息errno中
(3)例子:
a.
int main() {for (int i = 0; i <= 10; i++) {printf("%d %s\n",i,strerror(i));}return 0;
}
结果:
b.
//打开文件
int main() {//打开成功返回一个FILE* 类型的指针,打开失败返回一个NULL指针FILE* pfile = fopen("add.txt","r");//产生错误的时候,会自动的将错误码放入错误信息errno中if (pfile == NULL) {printf("打开失败的原因是:%s\n",strerror(errno));}return 0;
}
结果:
(2)perror
1、功能:错误信息打印
2、使用:
(1)介绍:
说明:此处参数可传可不传,属于你的自定义信息,类似与printf中你输入的文字,它会默认将程序中的错误信息打印出来,你可以自由加一些自定义信息
(2)注意:
a.打印规则,先打印自定义信息,然后 “ :空格”,再打印错误信息
(3)实例:
int main() {FILE* pfile = fopen("add.txt", "r");if (pfile == NULL) {perror("打开失败的原因是");}return 0;
}
结果:
二、内存函数
内存函数与字符串函数最重要的区别是:内存函数适用于所有类型
1.memcpy
1、功能:内存拷贝
2、使用:
(1)介绍:
说明:
a.头文件:<string.h>
b.参数有三个,前两个是void* 类型的,是拷贝源于目的地;最后一个是拷贝的字节数
(2)注意:
a.传输的数字是字节数,而不是元素个数
b.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
c.这个函数在遇到 ‘\0’ 的时候并不会停下来。
d.如果source和destination有任何的重叠,复制的结果都是未定义的。
(3)示例:
a.
int main() {int arr1[10] = {0};int arr2[] = { 1,2,3,4,5 };memcpy(arr1,arr2,20);return 0;
}
结果:
3、模拟实现
void* my_memcpy(void* dest,const void* src,size_t num) {void* ret = dest;assert(dest && src);while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main() {int arr1[10] = { 0 };int arr2[] = { 1,2,3,4,5 };my_memcpy(arr1,arr2,20);return 0;
}
2.memmove
1、功能:内存移动
2、使用:
(1)介绍:
说明:
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
(2)注意:
a.在模拟实现中,起码要有两种情况
(3)示例:
a.
int main() {char arr1[] = "abcdefgh";memmove(arr1+2,arr1+3,4);printf("%s\n",arr1);return 0;
}
结果:
3、模拟实现:
void* my_memmove(void* dest,const void* src,size_t num) {void* ret = dest;assert(dest && src);//小于时,从后往前拷贝if (src < dest) {while (num--) {*((char*)dest+ num) = *((char*)src+num);}}//其他情况,从前往后拷贝else{while (num--) {*(char*)dest = *(char*)src;src = (char*)src + 1;dest = (char*)dest + 1;}}return ret;
}
3.memset
1、功能:内存设置
2、使用:
(1)介绍:
说明:以字节为单位设置值
(2)注意:
a.因为单位是字节,所以最适用于字符类型的数组
(3)示例:
a.
int main() {
char arr1[] = “hello world”;
memset(arr1+6, ‘a’, 5);
printf(“%s\n”,arr1);
}
结果:
4.memcmp
1、功能:内存比较
2、使用:
(1)介绍:
说明:比较两内存空间的前num个字节的内容
(2)注意:
第一个内存块大于第二个内存块,则返回大于0的数字
第一个内存块等于第二个内存块,则返回0
第一个内存块小于第二个内存块,则返回小于0的数字
(3)示例:
a.
int main() {int arr1[] = { 1,2,3,4,5 };int arr2[] = { 1,3,3,4,5 };int ret1 = memcmp(arr1,arr2,4);//小端存储int ret2 = memcmp(arr1,arr2,5);printf("%d %d\n",ret1,ret2);
}
结果:
相关文章:

字符串函数与内存函数讲解
文章目录 前言一、字符串函数1.求字符串长度strlen 2.长度不受限制的字符串函数(1)strcpy(2)strcat(3)strcmp 3.长度受限制的字符串函数(1)strncpy(2)strncat(3)strncmp 4.字符串查找(1)strstr(2)strtok 5.错误信息报告(1)strerror(2)perror 二、内存函数1.memcpy2.memmove3.me…...

c语言系统编程之多进程
程序与进程的区别? 程序是静态的未运行的二进制文件,存储在磁盘中 进程是已经运行的二进制文件,存储在内存中 进程的内存划分图有哪几部分? 堆(存储malloc和calloc出来的空间)、栈(局部变量…...
前端还是后端:探讨Web开发的两大街区
前端还是后端:探讨Web开发的两大街区 一、引言二、两者的对比分析技能要求和专业知识职责和工作内容项目类型和应用领域就业前景和市场需求 三、技能转换和跨领域工作四、全栈开发结语 一、引言 Web开发领域涉及到前端开发和后端开发这两个不同而又互为补充的领域。…...

JavaScript中如何确定this的值?如何指定this的值?
🎀JavaScript中的this 在绝大多数情况下,函数的调用方法决定了this的值(运行时绑定)。this不能在执行期间被赋值,并且在每次函数呗调用时this的值也可能会不同。 🍿如何确定this的值: 在非严格…...

ubuntu下源码编译方式安装opencv
基础条件 ubuntu 20.04 opencv 3.4.3 opencv 源码编译的安装步骤 第一步, 首先clone源码 git clone https://github.com/opencv/opencv.git第二步,依赖包,执行下面的命令 sudo apt-get install build-essential sudo apt-get install cmak…...

spring boot整合常用redis客户端(Jedis、Lettuce、RedisTemplate、Redisson)常见场景解决方案
Java操作redis有三种客户端供选择:Jedis、Lettuce、Redisson。 在实际项目中运用最多的客户端还是Redisson、RedisTemplate;其中RedisTemplate并非是一个新的redis客户端实现,RedisTemplate是Spring Data Redis中提供的封装好的redis操作模板…...
HarmonyOS之运行Hello World
目录 下载与安装DevEco Studio 配置环境 创建项目 认识DevEco Studio界面 运行Hello World 了解基本工程目录 工程级目录 模块级目录...
postgresql数据库|wal日志的开启以及如何管理
一, wal的基本概念 WAL即Write Ahead Log预写式日志,简称wal日志,相当于oracle中的redo日志。只是oracle中redo是固定几个redo日志文件,然后轮着切换去写入。pg中wal日志是动态切换,单个wal日志写满继续写下一个wal日志,连续不断生成wal日志。…...

小波变换学习笔记【1】
【声明】本博客为学习B站视频小波分解与重构所做笔记,供自己和大家查阅学习,想查看 up 原视频请移步 B 站,侵删。 1.1 小波变换的由来 傅里叶变换基本思想:将信号分解成一系列不同频率的连续正弦波的叠加。 其缺点是,…...

雷柏mv20鼠标使用体验
用了1年多,第一次用竖着的鼠标,现在已经很习惯了,感觉还不错。说说使用感受: 1、 仍然是长时间使用鼠标,但是很少出现手腕痛的情况,确实是有一定效果的。 2、使用场景是有限制的,我是配合笔记…...

【分布式云储存】Springboot微服务接入MinIO实现文件服务
文章目录 前言技术回顾准备工作申请accessKey\secretKey创建数据存储桶公共资源直接访问测试 接入springboot实现文件服务依赖引入配置文件MinIO配置MinIO工具类 OkHttpSSLSocketClient兼容ssl静态资源预览解决方案资源上传预览测试测试结果 前言 上篇博客我们介绍了分布式云存…...

机器人中的数值优化|【四】L-BFGS理论推导与延伸
机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化,拟牛…...

ThemeForest – Canvas 7.2.0 – 多用途 HTML5 模板
ThemeForest 上的 HTML 网站模板受到全球数百万客户的喜爱。与包含网站所有页面并允许您在 WP 仪表板中自定义字体和样式的 WordPress 主题不同,这些设计模板是用 HTML 构建的。您可以在 HTML 编辑器中编辑模板,但不能在 WordPress 上编辑模板࿰…...
本地部署 川虎 Chat
本地部署 川虎 Chat 1. 川虎 Chat 项目概述2. Github 地址3. 部署 川虎 Chat4. 配置 config.json5. 启动 川虎 Chat 1. 川虎 Chat 项目概述 为ChatGPT等多种LLM提供了一个轻快好用的Web图形界面和众多附加功能。 支持 GPT-4 基于文件问答 LLM本地部署 联网搜索 Agent 助理…...

IntelliJ IDEA 控制台中文乱码的四种解决方法
前言 IntelliJ IDEA 如果不进行配置的话,运行程序时控制台有时候会遇到中文乱码,中文乱码问题非常严重,甚至影响我们对信息的获取和程序的跟踪。开发体验非常不好。 本文中我总结出四点用于解决控制台中文乱码问题的方法,希望有助…...
23岁准备转行嵌入式
前端难找工作,而且感觉没有前景,我觉得我就算入行也不会干多久,软件开发让我感觉不到实在的东西。小时候喜欢去动手制作一些玩具,我对实在一些的东西感兴趣一些例如手表,小机器人等等一些。我有保持坚持学习下去的动力…...

http请求报错:406 Not Acceptable的解决办法
目录 应用场景 基本概念 解决方法 方法一: 方法二: 方法三: 应用场景 接口在返回结果集的时候出现了406的报错,但是返回String类型不会报错,正常返回。 基本概念 406 Not Acceptable是一个HTTP响应状态码&…...
信息化发展75
数字化治理 数字化治理通常指依托互联网、大数据、人工智能等技术和应用,创新社会治理方法与手段,优化社会治理模式,推进社会治理的科学化、精细化、高效化,助力社会治理现代化。数字化治理是数字经济的组成部分之一,…...

C++八股
1、简述一下C中的多态 在面向对象中,多态是指通过基类的指针或引用,在运行时动态调用实际绑定对象函数的行为,与之相对应的编译时绑定函数称为静态绑定。 静态多态 静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择…...

Nat. Commun. | 大规模高分辨单光子成像
本文由论文作者团队(课题组)投稿 单光子雪崩二极管(Single Photon Avalanche Diode,简称SPAD)阵列因其极佳的单光子灵敏度而受到广泛关注,已广泛应用于量子通信与计算、荧光寿命成像、时间飞行成像等各个领域。与同样具有较高灵敏度的EMCCD和sCMOS相比,SPAD阵列能够在极…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...