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

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

在这里插入图片描述

人无完人,持之以恒,方能见真我!!!
共同进步!!

文章目录

  • 一、strncpy函数的使用
  • 二、strncat函数的使用
  • 三、strncmp函数的使用
  • 四、strstr的使用和模拟实现
  • 五、strtok函数的使用
  • 六、strerror和perror函数的使用
    • 1.strerror函数
    • 2.perror函数

一、strncpy函数的使用

我们之前学习的strcpy的作用是把源字符串拷贝到目标空间内,而且经过我们的模拟实现,我们也意识到它拷贝的时候会把目标空间的内容给替换了,我们可以来测试一下:

在这里插入图片描述

可以看到,将arr2的内容拷贝到arr1中时,把arr1原本的内容替换了,那假设我们不想让它全部拷贝过来,只是拷取一部分OK不OK

这个时候就要引入我们带n的字符串函数,那个多出来的n就代表数量,是我们想拷贝字符串时,要拷贝的字符的个数
而不带n的字符串函数和带n的字符串函数的根本区别是带n的字符串函数更灵活,可以指定拷贝的字符的个数,所以也叫带n的字符串函数为受限制的字符串函数,不带n的为不受限制的字符串函数

接下来我们来看看本次讲到的strncpy函数的原型:

char * strncpy ( char * destination, const char * source, size_t num );

它的参数与strcpy的区别就是多了最后一个参数,它的作用就是指定我们要拷贝的字符的个数
它的特点如下:

  • 拷⻉num个字符从源字符串到⽬标空间
  • 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加\0,直到num个
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[20] = "ghijklmn";strncpy(arr1, arr2, 3);printf("%s\n", arr1);return 0;
}

在这里插入图片描述

可以看到只拷贝了arr2中的前三个字符进arr1,并且覆盖了arr1的前三个字符,这就是strncpy的作用
至于strncpy的模拟实现,与strcpy的模拟实现相似,这里就不再过多讲解

二、strncat函数的使用

strncat也是带n家族的一员,多n的原因和strncpy差不多,就是用来指定要追加到目标空间的字符的个数,它的原型如下:

char * strncat ( char * destination, const char * source, size_t num );

它的特点是:

  • 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符
  • 如果source指向的字符串的字符个数⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾

了解到这里我们来尝试使用一下strncat,把arr2的前3个字符追加到arr1里,如下:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[20] = "ghijklmn";strncat(arr1, arr2, 3);printf("%s\n", arr1);return 0;
}

运行结果:

在这里插入图片描述

如果后面的第三个参数num大于arr2的大小会发生什么呢?
运行结果:

在这里插入图片描述

调试结果:

在这里插入图片描述

三、strncmp函数的使用

strncmp的作用就是比较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟

如果在这num个字符中发现不⼀样,就看此时哪个字符串更大,前者大就返回大于0的数,如果后者大,就返回小于0的数如果num个字符都相等,就是相等返回0

我们来看看它的原型:

int strncmp ( const char * str1, const char * str2, size_t num );

我们来使用它比较arr1和arr2前三个字符的大小:

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "abcdef";char arr2[20] = "ghijklmn";int ret = strncmp(arr1, arr2, 3);printf("在前三个字符的比较中,");if (ret > 0)printf("arr1 > arr2\n");else if (ret < 0)printf("arr1 < arr2\n");elseprintf("arr1 = arr2\n");return 0;
}

运行结果:

在这里插入图片描述

四、strstr的使用和模拟实现

这是一个对我们来说比较新的函数,我们来仔细介绍一下使用方法以及它的模拟实现,它的作用就是返回后一个字符串在前一个字符串中第⼀次出现的位置

并且字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

接下来我们来看看strstr的原型:

const char* strstr ( const char* str1, const char* str2);

它的原型中参数看起来很简单,就是两个字符串,那它的返回值是啥捏?
有两种情况:

  • 如果在字符串str1中找到了字符串str2,那么就返回str1中找到str2的起始位置,
  • 如果没有在字符串str1中找到字符串str2,那么就返回一个NULL

所以在使用的时候,我们就可以通过它的返回值来确认是否找到对应的字符串,如果返回非空指针,那么就是找到了,返回空指针就是没有找到,接下来我们用实例来加深理解:

#include <stdio.h>
#include <string.h>void isfind(const char* x)
{if (x)printf("找到了\n");elseprintf("没找到\n");
}int main()
{char arr1[20] = "abcdef";char arr2[20] = "ghijklmn";char arr3[20] = "cde";isfind(strstr(arr1, arr2));isfind(strstr(arr1, arr3));return 0;
}

运行结果:

在这里插入图片描述

我们来模拟实现一下 strstr

  1. 函数命名:my_strstr
  2. 函数参数:可以照抄strstr函数的原型,如下:
const char* my_strstr ( const char* str1, const char* str2);
  1. 函数实现:
    (1)老样子,assert进行断言
    (2)然后我们来分析这个函数可能出现的情况,按照我们正常去想,就会想到首先就去看str1和str2指向的字符相不相等,不相等就两个指针都++,往后找,直到它们指向的字符相等
    (3)随后往后开始找,但是会出现一个问题,万一这一次匹配不上,只有前几个字符相等,后面并不相等,那我们怎么找到之前开始匹配的位置呢?如图:

在这里插入图片描述

(4)所以我们让str1和str2直接往后走是不妥的,这样一旦匹配失败,我们就记不住当时开始匹配的位置,也就不能进行下一次匹配,所以我们可以重新创建三个指针变量
(5)有两个用来装下str1,一个用来代替str1往后走,一个用来记住当前第一次匹配的位置,至于str1就老老实实待在原地,不要动
(6)还有一个用来装str2,这样如果匹配失败,就把str2重新赋值给这个变量,让它重新指向str2的开头,创建如下:

const char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = str1;//代替str1用来往后匹配字符const char* s2 = str2;//代替str2用来往后匹配字符const char* cp = str1;//记录开始匹配字符的位置
}

(7)有了以上的经验,我们为了避免犯错,可以使用思路比较简单的暴力匹配,就是创建一个循环,我们对cur进行解引用,只要里面不是结束标志\0,我们就进入循环,然后看这个位置的字符是否和str2的第一个字符相等

(8)如果不相等,我们就让cp++,让我们的当前位置往前挪动一下,如果相等,就进行完整的匹配,这里还是有两种情况,一是如果完全匹配那么就返回cp,就是我们开始匹配时的位置,二是如果不能完全匹配那么就还是让cp++,并且将cp重新赋值给s1,将str2重新赋值给s2

(9)现在我们就来看进行一次匹配的过程,也很简单,我们还是创建一个while循环,如果s1和s2解引用不是 \0,并且解引用后相等,那我们就让s1和s2加加,一直往后走,当循环结束时,我们就判断s2解引用后是否是 \0,如果是\0说明完全匹配上了,就返回cp,不是\0那么说明没有完全匹配,就让cp++,开始下一次循环查找

(10)最后一步就是,如果我们遍历了s1中的所有字符,还是发现两个字符串没有完全匹配的地方,就直接返回空指针NULL

const char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);if(*str2 == '\0'){return (char*)str1;}const char* s1 = str1;const char* s2 = str2;const char* cp = str1;while (*cp){s1 = cp;//重新赋值s2 = str2;//重新赋值while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return cp;cp++;}return NULL;
}

这是一般的情况:

在这里插入图片描述

我们换一种更复杂的情况测试:

在这里插入图片描述

可以看到我们实现的函数还是成功帮我们完成了任务,这里的strstr函数的实现就到此结束了,模拟实现这个函数要考虑多种情况,希望大家能够下来多敲敲,欢迎大家在评论区留言!

五、strtok函数的使用

这也是一个新函数,它的作用是什么呢?它可以按照我们给出的分隔符来分割我们的字符串,现在我们先来了解一下它的原型:

char * strtok ( char * str, const char * sep);

接下来我们来总结一下它的特点:

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

比如我们的邮箱由两个分隔符分隔开来,就是@符合和(.)点号,我们想把这个邮箱地址分隔开来可以这样操作:

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "BANZHANCHAXIANG@163.com";char arr2[] = "@.";char* ret1 = strtok(arr1, arr2);char* ret2 = strtok(NULL, arr2);char* ret3 = strtok(NULL, arr2);printf("%s\n%s\n%s\n", ret1, ret2, ret3);return 0;
}

运行结果:
在这里插入图片描述
可以看到我们成功把这个邮箱分成了三个部分,但是有一个问题,这里有两个分隔符我们就写了三行代码,这样的代码看起来是不是很挫,而且如果有n个分隔符,就会变得很麻烦,这时候就可以用下面的方法

#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "BANZHANCHAXIANG@163.com";char arr2[] = "@.";char* p = NULL;for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2)){printf("%s\n", p);}return 0;
}

运行结果:

在这里插入图片描述

我们利用for循环初始化只进行一次的技巧来调用第一次的strtok,并且将它赋值给p指针,随后我们调用strtok的第一个参数就只需要传空指针,就可以写在循环的调整部分

而中间的循环结束条件为什么设置为不等于NULL呢?因为当我们的字符串分隔完毕,没有分隔符后,函数就会返回一个空指针,p也就等于空指针了,此时用来退出循环刚好

六、strerror和perror函数的使用

1.strerror函数

strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误

但是如果当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的

strerror函数就可以将错误对应的错误信息字符串的地址返回,可以用%s的形式将错误信息打印出来

#include <stdio.h>
#include <string.h>int main()
{int i = 0;for (i = 0; i < 10; i++){printf("%s\n", strerror(i));}return 0;
}

在Windows11+VS2022环境下输出的结果如下:

在这里插入图片描述

我们可以测试使用文件操作测试一下:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{FILE * pFile;pFile = fopen ("data.txt","r");if (pFile == NULL)printf ("fopen: %s\n", strerror(errno));return 0;
}

在当前路径的代码目录上并没有data.txt这个文件,自然不能打开文件进行读操作,所以这个代码会在errno.h中产生一个错误码,这个时候我们就把这个错误码打印出来
在这里插入图片描述

2.perror函数

接下来我们也可以了解⼀下 perror 函数,perror函数的使用更加简单方便,可以直接将错误信息打印出来

perror函数的参数里可以写上可能出现错误的命令的名字,它可以打印参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{FILE * pFile;pFile = fopen ("data.txt","r");if (pFile == NULL)perror("fopen");return 0;
}

在这里插入图片描述

到这里我们一些常见的函数基本介绍完了,大家也可以自行去这个网站学习 cplusplus,下一期我们继续学习内存函数的使用和模拟实现!!!

相关文章:

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和perr…...

oracle to postgresql使用Oracle Golden Gate同步数据

参考 https://www.ktexperts.com/replication-to-gcp-postgresql-using-oracle-goldengate/ https://www.ktexperts.com/how-to-change-remote-trail-file-location-in-oracle-goldengate/...

基于Java Springboot校园导航微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse微信开发…...

【软件安全专题文档】系统安全设计规范,网络与信息系统安全设计规范,信息系统安全架构方案设计规范(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件项目全周期文档清单部分文件概览&a…...

【青牛科技】SCU2N60E/SCD2N60E N沟道增强型功率场效应晶体管采用Silicore先进的VDMOS技术生产

描述&#xff1a; 这些N沟道增强型功率场效应晶体管采用Silicore先进的VDMOS技术生产&#xff0c;为设计人员提供了卓越的开关性能、坚固的器件设计、低导通电阻和成本效益。 特点&#xff1a; 在VGS10V时&#xff0c;600V&#xff0c;2.0A&#xff0c;Rdson4.5Ω&#xff08…...

常见限流算法介绍 和 Spring Cloud Sentinel使用方式

sentinel 限流及熔断 为什么要限流呢&#xff1f;对于一些突发流量&#xff0c;如双11大促&#xff0c;甚至恶意攻击&#xff0c;这时系统的访问量远远超出系统的承受能力&#xff0c;如果不做任何保护措施&#xff0c; 服务器资源会耗尽&#xff0c;进而系统不可用。 限流就…...

工业齐套管理虚拟现实仿真模拟软件

工业齐套管理虚拟现实仿真模拟软件是与法国最大的汽车制造商合作开发的一款虚拟现实仿真模拟软件&#xff0c;借助身临其境的虚拟现实环境&#xff0c;无需停止生产线&#xff0c;即可模拟仓库和提货区域。 工业齐套管理虚拟现实仿真模拟软件不仅适用于汽车工业&#xff0c;安全…...

HarmonyOS(60)性能优化之状态管理最佳实践

状态管理最佳实践 1、避免在循环中访问状态变量1.1 反例1.2 正例 2、避免不必要的状态变量的使用3、建议使用临时变量替换状态变量3.1 反例3.2 正例 4、参考资料 1、避免在循环中访问状态变量 在应用开发中&#xff0c;应避免在循环逻辑中频繁读取状态变量&#xff0c;而是应该…...

Qt5语法的connect指定多个重载信号槽函数中的具体某一个

Qt5新语法的connect函数&#xff0c;使用起来更加简洁明了&#xff0c;但如果信号槽有同名的多个重载函数&#xff0c;只用类名和函数名就无法绑定&#xff0c;这时&#xff0c;可以使用qOverload来指定参数类型&#xff0c;例如&#xff1a; connect(ui->comboBox, qOverlo…...

Mysql远程工具Navicat Premium连接报错1130、2003解决方案

这里写自定义目录标题 1130报错&#xff1a;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/107d09a6fc324a46b922bf65cab81c58.png)2003报错&#xff1a; 1130报错&#xff1a; 原因&#xff1a; 连接异常 1130&#xff0c;没有远程登录权限。 解决方案&#xff…...

ShardingSphere介绍

1. ShardingSphere简单介绍 ShardingSphere是一款目前业内比较流行的分库分表框架&#xff0c;到现在为止有接近十年的开发历程了&#xff0c;其 已经不仅仅只是⽤来做分库分表&#xff0c;⽽是形成了⼀个围绕 分库分表核⼼的技术⽣态。他的核⼼功能已经包括了数据分⽚、分布式…...

操作系统 | 学习笔记 | 王道 | 2.2处理机调度

2.2 处理机调度 文章目录 2.2 处理机调度2.2.1 调度的概念2.2.2 调度的目标2.2.3 调度的实现2.2.4 典型的调度算法错题总结&#xff1a; 2.2.1 调度的概念 调度的基本概念 处理机调度是对处理机进行分配&#xff0c;即从就绪队列中按照一定的算法&#xff08;公平、高效的原则&…...

我们项目要升级到flutter架构的几点原因

一、探索 Flutter打造卓越移动应用的新时代框架 在移动应用开发的世界里&#xff0c;Flutter已经成为了一个炙手可热的话题。诞生于Google的怀抱&#xff0c;Flutter以其独特的优势和理念&#xff0c;正在引领一场全球范围内的应用开发 ** 。本文将深入探讨Flutter项目的特点、…...

Solidity开发智能合约

05-Solidity开发智能合约 0 Solidity和智能合约 Solidity开发可运行的智能合约步骤&#xff1a; 源代码通过编译成字节码&#xff08;Bytecode&#xff09;&#xff0c;同时会产生二进制接口规范&#xff08;ABI&#xff09; 通过交易将字节码部署到以太坊网络&#xff0c;部署…...

bind实验

服务端 查看域名 [rootclient yum.repos.d]# hostname client 设置域名 [rootclient yum.repos.d]# hostnamectl set-hostname dns1.openlab.edu [rootclient yum.repos.d]# cd [rootclient ~]# hostname dns1.openlab.edu 安装bind包 [rootclient ~]# yum install bind -y…...

ARM架构下安装新版docker及docker-compose

一、常见CPU 架构&#xff1a; 二、环境信息 CPU架构操作系统配置HUAWEI Kunpeng 920 5220 aarch64openEuler 22.03 (LTS-SP3)64C128g15T 三、安装docker 3.1 二进制包下载 docker-ce 社区下载地址&#xff1a; wget https://mirrors.nju.edu.cn/docker-ce/linux/static/s…...

自锁/非自锁开关原理笔记

前言&#xff1a;编写不易&#xff0c;请勿搬运&#xff0c;感谢理解&#xff0c;仅供学习。 开关介绍 6指针开关&#xff0c;这种开关分为自锁和非自锁开关&#xff0c;自锁开关有两种状态&#xff0c;按下和松开的状态&#xff0c;非自锁开关在按下过后&#xff0c;按键会复…...

基于SpringBoot+Vue的论坛网站-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 &#xff08;1&#xff09;问题反…...

基于SSM的博客系统+LW参考示例

1项目介绍 系统角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理&#xff0c;博文分类管理&#xff0c;博文信息管理&#xff0c;话题分类管理&#xff0c;热议话题管理&#xff0c;私信管理&#xff0c;敏感词管理&#xff0c;系统管理等&am…...

[241129] Docker Desktop 4.36 发布:企业级管理功能、WSL 2 增强 | Smile v4.0.0 发布

目录 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强Smile v4.0.0 发布&#xff01;Java 机器学习库迎来重大升级 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强 Docker Desktop 4.36 带来了强大的更新&#xff0c;简化了…...

webpack5开发环境、生产环境配置 (三)

开发环境&#xff1a;就是我们开发代码时使用的模式。 这个模式我们做两件事情&#xff1a; 1、编译代码&#xff0c;使浏览器能识别运行 2、代码质量检查&#xff0c;树立代码规范 生产环境&#xff1a;开发完成代码后&#xff0c;我们需要得到代码将来部署上线。 这个模式…...

一次Kafka启动失败引出的问题

背景 Some time&#xff0c;有个现场童鞋说咱的Kafka实例有个broker一直crash&#xff0c;还截图给我看了&#xff0c;大致是Kafka启动加载topic分区日志文件的时候&#xff0c;然后就没了&#xff0c;连个WARN都没有。当然&#xff0c;光看这个截图咱啥都不知道&#xff0c;因…...

[Linux] 进程间通信——匿名管道命名管道

标题&#xff1a;[Linux] 进程间通信——匿名管道&&命名管道 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、进程间通信 二、进程间通信的方案——匿名管道 &#xff08;1&#xff09;匿名管道的原理 &#xff08;2&#xff09;使用匿名管道 三、进…...

人机交互中的状态交互、趋势交互

在人机交互中&#xff0c; 状态交互 和 趋势交互 是两种重要的交互方式&#xff0c;它们分别涉及到用户与系统之间不同的交互模型和机制。 1. 状态交互 状态交互主要聚焦于用户与系统之间的状态转换及其反馈机制。在这种交互模式下&#xff0c;系统会根据用户的输入或行为发生状…...

基于Java Springboot房屋租赁App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…...

golang的wails框架在macos下的问题

1、前言 之前练手写了格调用ollama api的web应用&#xff0c;想找个容器打包下&#xff0c;于是找到wails来打包&#xff0c;windows下都是很正常的&#xff0c;因为就是普通的http调用&#xff0c;也没遇到cors跨域问题&#xff0c;但是到了macos下使用wails dev命令启动的客户…...

编程设计模式助记顺口溜

1、顺口溜 创建型&#xff0c;工厂多&#xff0c;单例建对象&#xff0c;抽象工厂做。建造者分步做&#xff0c;原型克隆最不愁。 结构型&#xff0c;适配器&#xff0c;桥接组合都不错&#xff0c;装饰外观飞享元&#xff0c;代理再添一把火。 行为型&#xff0c;责任链&…...

java网络通信(三):TCP通信、实现客户端-服务端消息通信

目录 1、什么是 TCP协议&#xff1f; 2、代码实现TCP协议的一发一收 2.1、客户端 2.2、服务端 2.3 结果演示 3、代码实现TCP协议的多发多收 3.1 客户端 3.2 服务端 3.3 结果演示 简介&#xff1a;本文章主要是演示如何用java代码以及TCP协议实现网络通信&#xff0c;实…...

mybatis-plus 对于属性为null字段不更新

MyBatis-Plus 默认情况下会根据字段的值是否为 null 来决定是否生成对应的 UPDATE 语句。这是由 更新策略 决定的&#xff0c;默认的行为是 忽略 null 值&#xff0c;即如果字段值为 null&#xff0c;该字段将不会出现在 UPDATE 语句中。 默认行为分析 MyBatis-Plus 默认的 Fi…...

GAGAvatar: Generalizable and Animatable Gaussian Head Avatar 学习笔记

1 Overall GAGAvatar&#xff08;Generalizable and Animatable Gaussian Avatar&#xff09;&#xff0c;一种面向单张图片驱动的可动画化头部头像重建的方法&#xff0c;解决了现有方法在渲染效率和泛化能力上的局限。 旋转参数 现有方法的局限性&#xff1a; 基于NeRF的方…...

《数据挖掘:概念、模型、方法与算法(第三版)》

嘿&#xff0c;数据挖掘的小伙伴们&#xff01;今天我要给你们介绍一本超级实用的书——《数据挖掘&#xff1a;概念、模型、方法与算法》第三版。这本书是数据挖掘领域的经典之作&#xff0c;由该领域的知名专家编写&#xff0c;系统性地介绍了在高维数据空间中分析和提取大量…...

springboot vue 开源 会员收银系统 (12)购物车关联服务人员 订单计算提成

前言 完整版演示 http://120.26.95.195/ 开发版演示 http://120.26.95.195:8889/ 在之前的开发进程中&#xff0c;我们完成订单的挂单和取单功能&#xff0c;今天我们完成购物车关联服务人员&#xff0c;用户计算门店服务人员的提成。 1.商品关联服务人员 服务人员可以选择 一…...

lua闭包Upvalue

闭包 lua任何函数都是闭包&#xff0c;闭包至少带1个upValue&#xff1b; CClosure是使用Lua提供的lua_pushcclosure这个C-Api加入到虚拟栈中的C函数&#xff0c;它是对LClosure的一种C模拟 如string.gmatch就是cclosure 定义&#xff1a; #define ClosureHeader \CommonH…...

下载maven 3.6.3并校验文件做md5或SHA512校验

一、下载Apache Maven 3.6.3 Apache Maven 3.6.3 官方下载链接&#xff1a; 二进制压缩包&#xff08;推荐&#xff09;: ZIP格式: https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipTAR.GZ格式: https://archive.apache.org/dist/…...

深入探索Flax:一个用于构建神经网络的灵活和高效库

深入探索Flax&#xff1a;一个用于构建神经网络的灵活和高效库 在深度学习领域&#xff0c;TensorFlow 和 PyTorch 作为主流的框架&#xff0c;已被广泛使用。不过&#xff0c;Flax 作为一个较新的库&#xff0c;近年来得到了越来越多的关注。Flax 是一个由Google Research团队…...

vue项目中单独文件的js不存在this.$store?.state怎么办

在Vue项目中&#xff0c;如果你在单独的文件&#xff08;比如插件、工具函数等&#xff09;中遇到this.$store不存在的情况&#xff0c;这通常是因为this上下文不指向Vue实例&#xff0c;或者Vuex store没有被正确地注入到Vue实例中。以下是几种可能的解决方案&#xff1a; 确保…...

物联网客户端在线服务中心(客服功能/私聊/群聊/下发指令等功能)

一、界面 私聊功能&#xff08;下发通知类&#xff0c;一对多&#xff09;群聊&#xff08;点对点&#xff09;发送指令&#xff08;配合使用客户端&#xff0c;基于cefsharp做的物联网浏览器客户端&#xff09;修改远程参数配置&#xff08;直接保存到本地&#xff09;&#…...

AI开发:逻辑回归 - 实战演练- 垃圾邮件的识别(二)

接上一篇AI开发&#xff1a;逻辑回归 - 实战演练- 垃圾邮件的识别&#xff08;一&#xff09; new_email 无论为什么文本&#xff0c;识别结果几乎都是垃圾邮件,因此我们需要对源码的逻辑进行梳理一下&#xff1a; 在代码中&#xff0c;new_email 无论赋值为何内容都被识别为…...

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示&#xff1a; error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…...

Vue的数据驱动原理

文章目录 什么是数据驱动那么vuejs是如何实现这种数据驱动的呢?对getter/setter的理解?一个简单的演示例子vue数据驱动原理是:采用数据劫持结合发布者和订阅者模式,通过“object.defineproperty()”来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应…...

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

数据分析-52-时间序列分解之变分模态分解VMD

文章目录 1 时间序列模态分解1.1 模态分解的概念1.2 模态分解的作用1.3 常用的模态分解方法1.4 模态分解的常用库2 变分模态分解VMD2.1 VMD的流程2.2 加载数据集2.2.1 数据重采样2.2.2 原始数据可视化2.3 VMD变分模态分解3 参考附录1 时间序列模态分解 1.1 模态分解的概念 时…...

做异端中的异端 -- Emacs裸奔之路4: 你不需要IDE

确切地说&#xff0c;你不需要在IDE里面编写或者阅读代码。 IDE用于Render资源文件比较合适&#xff0c;但处理文本&#xff0c;并不划算。 这的文本文件&#xff0c;包括源代码&#xff0c;配置文件&#xff0c;文档等非二进制文件。 先说说IDE带的便利: 函数或者变量的自动…...

redhat 7.9配置阿里云yum源

1、mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2、添加dns vim/etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 nameserver 114.114.114.114 #配置完先检查下通不通 3、vi /etc/yum/pluginconf.d/subscription-manager.conf # 将 “enabled1” 改为 “ena…...

简单快速的上手python

前言 python是一门可以快速上手的语言&#xff0c;原因是它语法简单&#xff0c;api容易使用自由灵活 当我们需要安装任何的三方库时&#xff0c;只需要执行 pip install XX 之后在代码里面import xxx就可以使用python啦。 并且python的代码自由灵活&#xff0c;使用缩进区…...

PHP和GD如何给图片添加模糊边缘效果

在PHP中&#xff0c;使用GD库给图片添加模糊边缘效果通常涉及几个步骤&#xff0c;包括加载图片、创建模糊效果、应用边缘处理以及保存结果图片。然而&#xff0c;GD库本身并不直接提供边缘模糊的函数&#xff0c;但你可以通过一些技巧来实现类似的效果。 以下是一个简化的步骤…...

PowerShell:查找并关闭打开的文件

Get-SmbOpenFile 打开 Windows PowerShell 并运行 Get-SmbOpenFile | Format-List 若要仅显示特定文件共享的连接&#xff0c;请使用 Where-Object 运行 Get-SmbOpenFile。 Get-SmbOpenFile | Where-Object Path -eq "C:\Data\" | Format-List Get-SmbSession 显…...

SQL进阶技巧:非等值连接--单向近距离匹配

目录 0 场景描述 1 数据准备 2 问题分析 ​编辑 ​编辑 3 小结 数字化建设通关指南 0 场景描述 表 t_1 和表 t_2 通过 a 和 b 关联时,有相等的取相等的值匹配,不相等时每一 个 a 的值在 b 中找差值最小的来匹。 表 t_1:a 中无重复值 表 t_1:a 中无重复值 a 1 2 4 …...

【golang】单元测试,以及出现undefined时的解决方案

单元测试 要对某一方法进行测试时&#xff0c;例如如下这一简单减法函数&#xff0c;选中函数名后右键->转到->测试 1&#xff09;Empty test file 就是一个空文件&#xff0c;我们可以自己写测试的逻辑 但是直接点绿色箭头运行会出问题&#xff1a; 找不到包。我们要在…...

代理IP地址的含义与设置指南‌

在数字化时代&#xff0c;互联网已经成为我们日常生活不可或缺的一部分。然而&#xff0c;在享受互联网带来的便利的同时&#xff0c;我们也面临着隐私泄露、访问限制等问题。代理IP地址作为一种有效的网络工具&#xff0c;能够帮助我们解决这些问题。本文将详细介绍代理IP地址…...