【C语言】字符串函数详解
文章目录
- Ⅰ. strcpy -- 字符串拷贝
- 1、函数介绍
- 2、模拟实现
- Ⅱ. strcat -- 字符串追加
- 1、函数介绍
- 2、模拟实现
- Ⅲ. strcmp -- 字符串比较
- 1、函数介绍
- 2、模拟实现
- Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度
- Ⅴ. strlen -- 求字符串长度
- 1、函数介绍
- 2、模拟实现(三种方式)
- ① 计数器的方式
- ② 递归的方式
- ③ 指针-指针的方式
- Ⅵ. strstr -- 字符串查找
- 1、函数介绍
- 2、模拟实现
- Ⅶ. strtok -- 字符串分割
- Ⅷ. strerror、perror -- 错误报告函数

Ⅰ. strcpy – 字符串拷贝
1、函数介绍
char *strcpy(char *Destination, const char *Source);
strcpy 函数是一个用于拷贝字符串的函数,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指针,第一个指向的是拷贝字符串的目的地的起始位置,即要将字符串拷贝到什么地方;第二个指向的是要拷贝字符串的内容的起始位置,即需要拷贝的字符串。它的返回值是目标空间的起始位置。
💥注意:
- 源字符串(需要被拷贝的字符串)必须以
\0
结束。 - 会将源字符串中的
\0
一同拷贝到目标空间。 - 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
举个例子,比如我们要将 arr2
数组中的 "def"
拷贝到 arr1
数组中。
#include<stdio.h>
#include<string.h>
int main()
{char arr1[10] = "abc";char arr2[] = "def";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}// 运行结果
def
注意: 拷贝结束后 arr1
数组中只有 "def"
,因为 "abc"
被覆盖了。
2、模拟实现
char* my_strcpy(char* dest, const char* src)
{if (dest == NULL || src == NULL)return NULL;char* p = dest;while (*p++ = *src++) // 当遇到\0赋值之后判断为0则退出循环,达到了我们的目的{}return dest;
}
在这个代码中,我们首先添加了一个错误处理机制,以防止传递给 strcpy
函数的参数是 NULL
指针。如果参数是 NULL
指针,则函数将返回 NULL
,main
函数将输出一条错误消息并退出程序。
此外,我们还使用了 const
关键字来指示源字符串 src
是只读的,这可以帮助我们防止无意中修改源字符串。
Ⅱ. strcat – 字符串追加
1、函数介绍
char *strcat(char *Destination, const char *Source);
strcat 函数是一个用于追加字符串的函数,即将一个字符串中的内容追加到另一个字符串后面(不会覆盖原字符串内容)。它的参数是两个指针,第一个指向的是追加字符串的目的地的起始位置,即要将字符串追加到什么地方;第二个指向的是要追加字符串的内容的起始位置,即需要追加的字符串。它的返回值是目标空间的起始位置。
💥注意:
- 源字符串必须以
\0
结束。 - 目标空间必须足够大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 字符串不能给自己追加(
\0
被覆盖,无终止条件)。
举个例子,比如我们要将 arr2 数组中的 “liren!” 追加到 arr1 数组的后面。
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello ";char arr2[] = "liren!";strcat(arr1, arr2);printf("%s", arr1);return 0;
}// 运行结果:
hello liren!
2、模拟实现
char* my_strcat(char* dest, const char* src)
{char* p = dest;while (*p != '\0') // 找到目标空间的'\0'{p++;}while (*p++ = *src++) // 当遇到\0赋值之后判断为0则退出循环,达到了我们的目的{}return dest;
}
这个实现中,首先定义了两个指针,一个指向目标字符串的末尾,一个指向源字符串的开头。然后,使用 while
循环将源字符串中的每个字符逐个复制到目标字符串的末尾,直到源字符串末尾为止。最后,在目标字符串的末尾添加一个 NULL
字符,表示字符串的结束。
需要注意的是,在本函数的实现中,目标字符串必须具有足够的空间来容纳源字符串,否则会导致缓冲区溢出和未定义行为。此外,源字符串必须是一个 const char*
类型的指针,以防止在函数内部修改源字符串的内容。
Ⅲ. strcmp – 字符串比较
1、函数介绍
int strcmp(const char *string1, const char *string2);
strcmp 函数是一个用于比较两个字符串内容的函数。它的参数是两个指针,指针分别指向两个待比较字符串的起始位置。它的返回值是一个整型数字。当 string1
大于 string2
的时候返回一个大于 0
的数;当 string1
等于 string2
的时候返回 0
;当 string1
小于 string2
的时候返回一个小于 0
的数。
💥注意:
- 字符串比较的不是字符串长度的大小,而是两个字符串中对应位置字符的
ASCII
值。
举个例子,比如比较字符串 "hello world!"
和字符串 "hello liren!"
的大小。
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello world!";char arr2[20] = "hello csdn!";printf("%d\n", strcmp(arr1, arr2));printf("%d\n", strcmp(arr2, arr1));return 0;
}// 运行结果:
1
-1
2、模拟实现
int my_strcmp(const char *s1, const char *s2)
{while (*s1 == *s2) {if(*s1 == '\0')return 0;s1++;s2++;}return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
这个实现中,使用 while
循环比较两个字符串中的每个字符。如果两个字符相等,则继续比较下一个字符;如果不相等,则返回它们的 ASCII
码之差。需要注意的是,由于有符号和无符号字符之间的比较会产生未定义行为,因此我们将两个指针都转换为 const unsigned char *
类型。
如果两个字符串完全相等,则返回值为 0
。如果 s1
小于 s2
,则返回一个负整数,反之则返回一个正整数。
需要注意的是,在使用 strcmp
函数比较字符串时,一定要确保两个字符串都以 NULL
字符结尾。如果没有以 NULL
字符结尾,会导致函数在比较过程中访问到未知的内存区域,从而导致未定义行为。
Ⅳ. strncpy、strncat、strncmp – 可限制操作长度
我们发现 strcpy 是将一个字符串全部拷贝到另一个字符串,strcat 是将一个字符串全部追加到另一个字符串后面,strcmp 也是比较两个字符串的全部内容,这类操作函数称为长度不受限制的字符串操作函数。
那么我们如果操作字符串时并不想操作整个字符串,而只想操作字符串的一部分怎么办呢❓❓❓
库函数中的 strncpy、strncat、strncmp 便解决了这个问题。
char *strncpy(char *Dest, const char *Source, size_t count);
char *strncat(char *Dest, const char *Source, size_t count);
int strncmp(const char *string1, const char *string2, size_t count);
这里就不细讲用法了,比较简单,自行尝试!
Ⅴ. strlen – 求字符串长度
1、函数介绍
size_t strlen( const char *string );
strlen 函数是一个用于求字符串长度的库函数。它的参数是被求长度的字符串的起始地址,返回值是一个无符号整型。
💥注意:
- 参数指向的字符串要以
\0
结束。 strlen
返回的是在字符串中\0
之前出现的字符个数(不包含\0
)。- 注意函数的返回值为
size_t
,是无符号的(易错)。
举个例子,比如我们要求字符串 "abcdef"
的长度。
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef";size_t ret = strlen(arr);printf("%d\n", ret);return 0;
}// 运行结果:
6
2、模拟实现(三种方式)
① 计数器的方式
我们定义一个变量为 count
,如果传入的指针指向的内容不是 \0
,那么 count++
,同时指针后移一位,循环往复,直到找到 \0
时返回 count
即可。
size_t my_strlen(const char* str)
{size_t count = 0; // 计数器while (*str){count++;str++;}return count;
}
② 递归的方式
我们一进入函数体就判断传入指针指向的内容是否为 \0
,如果是就返回 0
,不是就返回 1 + my_strlen(str+1)
,如此进行下去,直到递归到内层时找到 \0
,这时再一步步将值返回回来即可。
size_t my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
③ 指针-指针的方式
进入函数体时,我们事先定义一个指针变量将传入的指针保存下来,然后将传入的指针向后移,直到遇到 \0
时,我们返回当前指针与保存的指针的差值即可。(指针与指针的差的绝对值是两个指针之间的元素个数)
size_t my_strlen(const char* str)
{const char* p = str; // 保存起始位置while (*str != '\0')str++;return str - p;
}
Ⅵ. strstr – 字符串查找
1、函数介绍
char *strstr(const char *string, const char *strCharSet);
strstr 函数可以在一个字符串(字符串1)中查找另一个字符串(字符串2),如果字符串2存在于该字符串1中,那么就返回被字符串2在字符串1中第一次出现的起始位置,如果在字符串1中找不到字符串2,那么就返回空指针(NULL)。它的第一个参数是字符串1的起始位置,第二个参数是字符串2的起始位置。
💥注意:
- 若字符串2为空字符串,则返回字符串1的起始位置。
举个例子,比如我们在字符串 “abcdefbcd” 中查找字符串 “bcd”。
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdefbcd";char arr2[] = "bcd";char* ret = strstr(arr1, arr2); // 在arr1中查找arr2字符串第一次出现的位置if (ret != NULL)printf("%s\n", ret);elseprintf("找不到\n");return 0;
}// 运行结果:
bcdefbcd
注意:strstr
函数的返回值是字符串 "bcd"
在字符串 "abcdefbcd"
中 第一次出现的位置的起始位置,而不是出现几次就返回几个起始位置。
2、模拟实现
strstr
函数的模拟实现相对复杂,在实现过程中我们需要设置3个指针变量来辅助实现函数功能。
cp
指针: 记录每次开始匹配时的起始位置,当从该位置开始匹配时就找到了目标字符串,便于返回目标字符串出现的起始位置;当从该位置开始没有匹配成功时,则从cp++处开始下一次的匹配。p1
、p2
指针: 通过判断p1和p2指针解引用后是否相等来判断每个字符是否匹配成功,若成功,则指针后移比较下一对字符;若失败,p1指针返回cp指针处,p2指针返回待查找字符串的起始位置。
例如,在字符串"abbbcdef"中查找字符串"bbc":
刚刚开始时3个指针的指向如图所示:
若p1与p2匹配不成功,则cp指针后移,接着将cp指针赋值给p1指针:
此时,p1与p2匹配成功,那么cp指针不动,p1和p2指针后移继续比较:
当p1与p2匹配不成功时,cp指针后移一位,p1返回cp位置,p2返回待查找字符串起始位置:
从此位置开始下一轮的比较:
直到当p2指向的内容为\0时,便说明待查找字符串中的字符已经被找完,也说明了从当前cp位置开始匹配能够找到目标字符串,所以此时返回指针cp即可。
char* my_strstr(const char* str1, const char* str2)
{assert(str1 != NULL); // 断言,当str1为空指针报错assert(str2 != NULL); // 断言,当str2为空指针报错const char* cp = str1; // 记录开始匹配时的起始位置if (*str2 == '\0') // 要查找的字符串为空字符串return (char*)str1;while (*cp){const char* p1 = cp;const char* p2 = str2;while ((*p1!='\0') && (*p2!='\0') && (*p1 == *p2)){p1++;p2++;}if (*p2 == '\0') // 目标字符串已被查找完return (char*)cp;cp++;}return NULL; // 找不到目标字符串
}
但是这种算法的时间复杂度比较高,优化方法就是 KMP 算法,具体可以看 KMP 算法的笔记!
Ⅶ. strtok – 字符串分割
char *strtok(char *strToken, const char *strDelimit);
strtok 函数能通过给定的一系列字符将一个字符串分割成许多子字符串的函数。它的第一个参数是需要被分割的字符串的首地址;第二个参数是一个字符串的首地址,该字符串是用作分隔符的字符集合。返回值是查找到的标记的首地址。
💥注意:
- 找到 strToken 中的一个标记时,会将其用 \0 结尾并返回这个标记的首地址。
- strtok 函数是会改变 strToken 的,所以在使用 strtok 函数切分的字符串都是临时拷贝的内容并且可修改。
- 第一个参数不为 NULL 时,函数将找到 strToken 中的第一个标记,并保存它在字符串中的位置。
- 第一个参数为 NULL 时,函数将从同一个字符串中被保存的位置开始查找它的下一个标记。
- 若字符串中不存在更多的标记,则返回 NULL 指针。
举个例子,比如我们要将字符串"2916776007@qq.com"以"@“字符和”."字符分割开。
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "2916776007@qq.com"; // 待分割字符串char arr2[] = "@."; // 分隔符的字符集合char arr3[20] = { 0 };strcpy(arr3, arr1); // 将数据拷贝一份使用,防止原数据被修改char* token = strtok(arr3, arr2); // 第一次传参需传入待分割字符串首地址while (token != NULL) // 说明还未分割完{printf("%s\n", token);token = strtok(NULL, arr2); // 对同一个字符串进行分割,第二次及以后的第一个参数为NULL}return 0;
}// 运行结果:
2916776007
qq
com
注意: 当 strtok 函数找到第一个标记时,将其后的 ’@‘ 字符改为 ’\0’ 并返回第一个标记的首地址,所以我们以返回的地址为首地址开始打印字符串的时候就只会打印出 2916776007,第二次再对该字符串调用 strtok 函数时将从 ’@’ 字符后面开始寻找下一个标记。
Ⅷ. strerror、perror – 错误报告函数
char *strerror(int errnum);
strerror 函数可以把错误码转换为对应的错误信息,返回错误信息对应字符串的起始地址。
void perror(const char *string);
perror 函数可以打印一个错误信息,无返回值。
我们需要知道,库函数在使用的时候如果发生错误,都会有对应的错误码,而这些错误码都会被存放在 errno 这个全局变量中,如果要使用这个全局变量,我们需要引其对应的头文件:#include<errno.h>
举个例子:(注:fopen函数的功能是打开一个文件,当其执行成功时会返回打开文件的首地址,执行失败时会返回一个空指针)
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{FILE* pf = fopen("test.txt", "r");//打开test.txt文件阅读if (pf == NULL){printf("%s\n", strerror(errno));perror("fopen");}return 0;
}// 运行结果:
No such file or directory
fopen: No such file or directory
当我们要打开一个不存在的文件(test.txt)来阅读的时候,显然fopen函数会执行失败,于是pf指针接收的便是空指针(NULL)。
- strerror: 只负责将错误码转换为对应的错误信息,不打印。
- perror: 直接打印错误信息,并且我们可以自己加上注释来明确错误来源于哪个库函数。
相关文章:
【C语言】字符串函数详解
文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现(…...
CRMEB多商户商城系统JAVA版 B2B2C商家入驻平台系统独立版全开源
系统框架 基于Java vueuni-app开发,并采用业界主流开发框架SpringBoot; 前端开发中,Web PC管理端使用vue element山,移动端使用uni-app框架,前后端分离开发;...
【Linux】进程状态
一、概念 我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务) 在操作系统原理中:运行状态分为以下三种:运行状态(执行)、阻塞状态、就绪状态 1. 运行状…...
深入理解计算机系统阅读笔记-第十二章
第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型,一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如…...
《C++11》nullptr介绍:从NULL说起
在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…...
Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统系列文章(四)
文章目录 概要1 Realsense相机驱动安装Method1: 使用Intel服务器预编译包Method2: 使用ROS服务器预编译包Method3: 使用SDK源代码方法对比总结 2 Realsense-ROS通讯配置与使用2.1 Realsense-ROS包安装2.2 ROS节点启动 小结Reference 概要 本文首先阐述了Realsense相机驱动安装…...
conntrack iptables 安全组
centos 安装yum install conntrack-tools 1. conntrack状态 NEW: 新建连接(第一次包)。 ESTABLISHED: 已建立连接,正在传输数据。 RELATED: 与已有连接相关的连接,如 FTP 数据连接。 INVALID: 无效连接,无法识别或不…...
基于springboot+vue的 嗨玩-旅游网站
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
SQL多表联查、自定义函数(字符串分割split)、xml格式输出
记录一个报表的统计,大概内容如下: 多表联查涉及的报表有:房间表、买家表、合同表、交易表、费用表、修改记录表 注意:本项目数据库使用的是sqlserver(mssql),非mysql。 难点1:业主信息&#…...
神经网络
“损失函数 王木头学科学-哔哩哔哩_bilibili 一、transformer和注意力机制的本质,以及编码和解码的结构及其与注意力机制的关系,帮助理解transformer的优势和应用场景。 00:01 - 介绍transformer是人工智能主流技术,大语言模型GBT是在其基础…...
C16.【C++ Cont】string类字符串的关系运算和与string有关的函数
目录 1.知识回顾:strcmp函数 2.六个关系运算符 示例代码1 运行结果 示例代码2 运行结果 3.stoi和stol函数 1.stoi函数 函数声明 使用说明 示例代码3 运行结果 示例代码4 运行结果 示例代码5 运行结果 示例代码6 运行结果 2.stol函数 4.stod和stof函数 1.s…...
深入剖析 Wireshark:网络协议分析的得力工具
在网络技术的广阔领域中,网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具,在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...
七大排序算法(Java,便于理解)
时间换空间排序算法 一.冒泡排序 package SortDemo;import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue;public class BubbleSort {//冒泡排序,相邻两个数两两比较private int[]a;public void swap(int i,int j){int tempa[i];a[i]a[j];…...
洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树 c语言
题目: P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 题目描述 伐木工人 Mirko 需要砍 M 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko…...
MySQL8.0新特性
第十八章_MySQL8.0新特性 1.新特性概述 1. 数据库管理和存储 1.1 数据字典 特性: MySQL 8.0 使用统一的数据字典存储元数据(如表、列、索引等),并将其存储在 InnoDB 表中。 优点 : 提升性能:减少对文件系统的依赖。 提高一致…...
Browser-Use Web UI:浏览器自动化与AI的完美结合
Browser-Use Web UI:浏览器自动化与AI的完美结合 前言简介一、克隆项目二、安装与环境配置1. Python版本要求2. 安装依赖3. 安装 Playwright4. 配置环境变量(非必要步骤)三、启动 WebUI四、配置1. Agent设置2. 大模型设置3. 浏览器相关设置4. 运行 Agent结语前言 Web UI是在…...
006-excel数据输出insert语句
一、在空白列插入,选择需要的列 "INSERT INTO tab_name1 (code, name) VALUES ("&A1&", "&B1&");"二、 拖动填充块,或者双击填充块(可以快速填充整列) 三、直接把生成的 insert 语…...
AI大模型如何赋能电商行业并引领变革?
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于AI大模型如何赋能电商行业并引领变革的相…...
食堂采购系统源码:基于PHP的校园食堂供应链管理平台开发全解析
传统的食堂采购管理普遍存在信息不透明、流程繁琐、效率低下等问题,这使得开发一款高效、智能的食堂采购系统变得尤为重要。本篇文章,笔者将详细解析基于PHP开发的校园食堂供应链管理平台,从功能设计、系统架构到技术实现,全方位剖…...
【2024华为OD-E卷-100分-字符串分割】(题目+思路+JavaC++Python解析)
题目 字符串分割 给定一个字符串 s 和一个整数 k,你需要将字符串 s 分割成恰好 k 个非空子字符串,使得这些子字符串中字典序最大的子字符串尽可能小。 输入: 第一行输入一个字符串 s(只包含小写字母)。第二行输入一…...
MCP Server开发的入门教程(python和pip)
使用python技术栈开发的简单mcp server 需要安装 MCP server的需要使用python-sdk,python需要 3.10,安装如下 pip install mcpPS: MCP官方使用的是uv包管理工具,我平时使用pip比较多,所以文中以pip为主。因为mcp的一些依赖包版本并不是最新的,所以最好弄一个干净的环境…...
我的年度总结
这一年的人生起伏:从曙光到低谷再到新的曙光 其实本来没打算做年度总结的,无聊打开了帅帅的视频,结合自己最近经历的,打算简单聊下。因为原本打算做的内容会是一篇比较丧、低能量者的呻吟。 实习生与创业公司的零到一 第一段工…...
48_Lua错误处理
在编写Lua应用时,都可能会遇到不可预见的错误,而错误处理是确保程序稳定性和健壮性的关键环节。有效的错误处理不仅能防止程序崩溃,还能提供有用的反馈信息给开发者或最终用户,从而提高应用程序的质量。本文将详细介绍Lua中的错误处理机制。 1.错误类型 Lua中的错误类型主…...
掌握 React 关键:理解 super () 和 super (props) 的不同应用
在 React 中,super() 和 super(props) 都与 React 类组件的构造函数(constructor)以及继承有关。为了理解它们之间的区别,我们需要了解 JavaScript 类继承机制以及 React 类组件的工作原理。 1. super() 与 super(props) 的区别 …...
type 属性的用途和实现方式(图标,表单,数据可视化,自定义组件)
1.图标类型 <uni-icon>组件中,type可以用来指定图标的不同样式。 <uni-icons type"circle" size"30" color"#007aff"></uni-icons> //表示圆形 <uni-icons type"square" size"30" co…...
scala基础学习_方法函数
文章目录 方法与函数函数(又称函数值/匿名函数)定义方法注意 单参数函数多参数函数函数作为参数传递 方法将方法转换为函数方法的返回值总结 方法与函数 函数(又称函数值/匿名函数) 定义在任何地方:函数可以定义在类…...
linux: 文本编辑器vim
文本编辑器 vi的工作模式 (vim和vi一致) 进入vim的方法 方法一:输入 vim 文件名 此时左下角有 "文件名" 文件行数,字符数量 方法一: 输入 vim 新文件名 此时新建了一个文件并进入vim,左下角有 "文件名"[New File] 灰色的长方形就是光标,输入文字,左下…...
《深入理解Mybatis原理》Mybatis中的缓存实现原理
一级缓存实现 什么是一级缓存? 为什么使用一级缓存? 每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。 在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句&…...
【Debug】django.db.utils.OperationalError: (1040, ‘Too many connections‘)
报错: django.db.utils.OperationalError: (1040, ‘Too many connections‘) 排查 可能是Mysql的连接数量超过了允许的最大连接数量; 查看Mysql允许最大连接数量: -- 查看允许连接的最大数量 SHOW VARIABLES LIKE %max_connections%;-- 查…...
常用教程备份
1.Ubuntu 系统软件安装教程 https://blog.csdn.net/weixin_51591021/article/details/134363237 2.Docker 教程 https://blog.csdn.net/weixin_51591021/article/details/134363849 3.Makefile 教程 https://blog.csdn.net/weixin_51591021/article/details/134363638 4.…...
什么是视频孪生智慧能源?视频孪生智慧能源的应用案例
视频孪生智慧能源是集三维地理信息系统、视频虚实融合、数字孪生、人工智能等多技术于一体的综合应用,旨在实现对能源系统的实时、动态、全方位监控和管理。 具体来说,视频孪生智慧能源通过以下方式实现其功能: 技术融合:…...
Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书
文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…...
时序数据库的订阅对比:TDengine vs InfluxDB 谁更强?
目录 1. 架构:内置 vs 依赖外部 TDengine: InfluxDB: 2. 灵活性:动态订阅 vs 静态订阅 TDengine: InfluxDB: 3. 消费机制、API 兼容性与易用性对比 4. 结语 在时序数据应用场景中,数据实时消费和处理能力成为衡量数据库性能和可用性的…...
OpenCV实现多尺度细节提升算法
1、算法原理 多尺度细节提升算法来源于论文*《DARK IMAGE ENHANCEMENT BASED ON PAIRWISE TARGET CONTRAST AND MULTI-SCALE DETAIL BOOSTING》*,算法主要是解决细节增强算法中噪声和细节的平衡问题。 常规的非锐化掩蔽(USM)算法在提升细节…...
按键精灵ios越狱脚本教程:多选框联动的ui界面
以下是一个简单的 iOS 代码示例,使用 Swift 语言来创建一个包含多选框(复选框)的 UI 界面,并实现联动效果。 import UIKitclass ViewController: UIViewController {let checkbox1 UIButton(type:.system)let checkbox2 UIButt…...
YOLOv10-1.1部分代码阅读笔记-patches.py
patches.py ultralytics\utils\patches.py 目录 patches.py 1.所需的库和模块 2.def imread(filename: str, flags: int cv2.IMREAD_COLOR): 3.def imwrite(filename: str, img: np.ndarray, paramsNone): 4.def imshow(winname: str, mat: np.ndarray): 5.def tor…...
撤回最近的 git commit
在 Git 中,如果你想撤回最近的 git commit,可以根据不同的需求选择不同的操作。以下是几种常见的撤回方式: 1. 撤回最后一次 commit,但保留修改(soft reset) 如果你想撤销 git commit,但保留修…...
基于DFT与IIR-FIR滤波器的音频分析与噪声处理
基于DFT与IIR-FIR滤波器的音频分析与噪声处理 【完整源码文档报告】 【需要可随时联系博主,常在线能秒回!】 系统功能与实现介绍 功能与实现 音频处理系统界面搭建:利用MATLAB的GUI工具,构建了音频分析界面,包括文件导入、录…...
MySQL主从部署(保姆版)
一、mysql 同步复制有关概述 一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。…...
Golang笔记——协程同步
大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的协程同步的实现和应用场景。 文章目录 协程同步是什么?为什么需要协程同步?常见的协程同步机制互斥锁࿰…...
1.14学习
misc buuctf-大白 由提示可以知道这个应该是修改图片的宽高了,下载附件后得到了图片用随波逐流直接修改图片的宽高输出即可 buuctf-乌镇峰会种图 点击下载,出现了一个网页为图片将图片另存为,用随波逐流得到的信息解不了,再试…...
2025 年 JavaScript 入门教程
2025 年 JavaScript 入门教程 在当今数字化时代,JavaScript 作为一门广泛应用于 Web 开发的编程语言,其重要性不言而喻。无论是前端页面的交互实现,还是后端服务器的逻辑处理,JavaScript 都发挥着关键作用。本教程旨在帮助初学者…...
paddle——站在巨人肩膀上及背刺二三事
飞桨AI Studio - 人工智能学习与实训社区 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 先抛结论,对于想要快速了解某一领域有哪些比较适合落地的算法的从业人员来说,是一个很好的参考系统。从中可以知道从哪些模型里选型、如何轻量化、如何加…...
nvim , neovim , Lua 语法, text object
说明 : 了解一下 nvim 中的基本的 文本的类型。 基本类型有几种, 1 word , sentence , paragragh 2 (), {}, ,"", 3 就是 html 中的 tag 标签。 然后就是选中的类型。 1 i : 待变 inner 2 a: 代表around , 基本的动作有 &…...
6.2 MySQL时间和日期函数
以前我们就用过now()函数来获得系统时间,用datediff()函数来计算日期相差的天数。我们在计算工龄的时候,让两个日期相减。那么其中的这个now函数返回的就是当前的系统日期和时间。 1. 获取系统时间函数 now()函数,返回的这个日期和时间的格…...
批量识别图片型PDF指定区域内容识别保存表格+PDF批量改名:技术难题与项目实战总结
相关项目实战: 一、引言 在当今数字化办公环境中,批量处理PDF文件中的表格数据并进行改名是一项常见但具有挑战性的任务。无论是从大量的财务报销凭证、学术研究报告还是项目文档中提取表格信息,都可能遇到各种各样的技术难题。 二、批量提…...
【MySQL】索引(一)
索引 一、磁盘1、物理结构2、示意图3、定位扇区4、读写操作的基本方式 二、页1、介绍2、示例3、作用与结构4、类型(1)数据页(2)其他 5、组织与管理6、性能优化7、示意图(B树) 三、索引1、作用2、注意事项 四…...
缩放 对内外参的影响
当你对图像进行同比例缩小时,图像的内参需要相应地变化,但外参通常保持不变。 相机内参 相机内参(内参矩阵)描述了相机的固有属性,包括焦距和主点(光轴与图像平面的交点)的坐标。 当你对图像…...
excel设置好的可选择列数据后,如何快速输入到单元格中?
当设置好列的【数据】-【数据有效性】-【序列】后,在单元格中输入可选择数据的开头,就会提示出对应的可选择数据,然后,按一下键盘上的【↓】键,再按回车,即可快速输入到单元格中。...
设计一个流程来生成测试模型安全性的问题以及验证模型是否安全
要使用 Ollama 运行 llama3.3:70b 模型,并设计一个流程来生成测试模型安全性的问题以及验证模型是否安全,可以按照以下步骤进行设计和实现。整个过程包括环境配置、设计安全测试提示词、执行测试以及分析结果。以下是详细的步骤和指导: 1. 环…...