12字符函数
一、函数strchr与strrchr

- 注意:
- 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。
- strchr() 从左往右找,strrchr() 从右往左找。
- 字符串结束标记 ‘\0’ 被认为是字符串的一部分。
- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>// 自己写的库
/*** @brief 查找字符c在字符串s的位置* @note 从左到右来查找这个字符的位置 * @param s:指定要查找的字符串c:待查字符* @retval 成功:返回指向找到的字符的指针失败:返回NULL*/
char* MyLib_StrLChr(const char *s, int c)
{// 1、如果传进来的字符串是空的,那就没有必要继续下面的判断了if ( s == NULL)return NULL; // 失败,返回NULL// 2、移动指针s获取字符串的字符并与字符c判断是否一致,一致就退出while ( (*s != '\0') && (*s != c)){s++; // 指针s会一直往字符串的末尾移动(一直到'\0'为止)}// 3、判断是结束符'\0',还是找到的字符cif ( *s == '\0')return NULL;elsereturn (char *)s;
} /*** @brief 查找字符c在字符串s的位置* @note 从右到左来查找这个字符的位置 * @param s:指定要查找的字符串c:待查字符* @retval 成功:返回指向找到的字符的指针失败:返回NULL*/
char* MyLib_StrRChr(const char *s, int c)
{// 1、如果传进来的字符串是空的,那就没有必要继续下面的判断了if ( s == NULL)return NULL; // 失败,返回NULLconst char *tmp_p = s; // 记住最初的这个字符串的地址(也就是字符串首字符的地址)// 2、先将指针s移动到字符串的末尾while ( *s != '\0'){s++;}// 3、从右往左判断c是否存在while ( (*s != c) && ( s != tmp_p)){s--; }// 3、判断是结束符'\0',还是找到的字符cif ( s == tmp_p)return NULL;elsereturn (char *)s;
}
// 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库// 1、strchr函数(从左往右找)const char *s1 = "shijienameda";int c1 = 'i';char * p1 = strchr(s1, c1);printf("p1 == %s\n", p1);// 2、strrchr函数(从右往左找)const char *s2 = "shijienameda";int c2 = 'i';char * p2 = strrchr(s2, c2);printf("p2 == %s\n", p2);// (2)、自己写的库// 1、MyLib_StrChr函数(从左往右找)const char *s3 = "shijienameda";int c3 = 'i';char * p3 = MyLib_StrLChr(s3, c3);printf("p3 == %s\n", p3);// 2、MyLib_StrRChr函数(从右往左找)const char *s4 = "shijienameda";int c4 = 'i';char * p4 = MyLib_StrRChr(s4, c4);printf("p4 == %s\n", p4);return 0;
}
二、函数strstr

- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>// 自己写的库
/*** @brief 在指定的一个字符串中,找到一个子串* @note None * @param s:指定要查找的字符串c:待查字符* @retval 成功:返回指向找到的字符的指针失败:返回NULL*/
char* MyLib_StrStr(const char *haystack, const char *needle)
{// 初始化const char *tmp_p1 = haystack;const char *tmp_p2 = needle;const char *p1 = haystack;const char *p2 = needle;// 1、判断输入的两个字符串是否为NULL,为NULL就直接退出if ( (haystack == NULL) || (needle == NULL)){return NULL;}// 2、遍历haystack字符串,找到所有可能while ( *tmp_p1 != '\0'){// 在进去比较循环之前,将p1和p2的最初的的位置(循环之前)进行保留p1 = tmp_p1;p2 = tmp_p2;// 进入循环依次比较两个字符串的字符是否一致,防止比较的字符串在末尾while ( (*p1 == *p2) && (*p1 != '\0') && (*p2 != '\0')){p1++;p2++;}if ( *p2 == '\0') // 判断p2是否指向'\0',是的话,就意味着找到了s1中的子串s2{return (char *)tmp_p1; // 返回s1中的子串的地址}tmp_p1++;}// 3、没有找到该子串,就返回NULLreturn NULL;
}// 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库 const char *s1 = "chuangqianmingyueguang,yishidishangshuang";const char *s2 = "yishi";char *p1 = strstr(s1, s2);printf("p1 == %s\n", p1);// (2)、自己写的库 const char *s3 = "chuangqianmingyueguang,yishidishangshuang";const char *s4 = "yishi";char *p2 = MyLib_StrStr(s3, s4);printf("p2 == %s\n", p2);return 0;
}
三、函数strlen

- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>// 给类型取个别名
typedef unsigned long my_size_t;// 自己写的库
/*** @brief 求一个指定字符串的长度* @note None * @param s:需要求长度的字符串* @retval 成功:返回字符串的长度,不包含字符串结束标记'\0'失败:返回0*/
my_size_t MyLib_StrLen(const char *s)
{// 1、如果传进来的字符串是空的,那就没有必要继续下面的判断了if ( s == NULL)return 0; // 失败,返回0// 2、计算从左到右,一直到'\0',有多少个字符my_size_t cnt = 0;while ( *s != '\0'){cnt++;s++;}// 3、返回计算的字符串的长度return cnt;
}// 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库const char buf1[256] = "wuaiyousan,riyueyuqing,riweizhao,yueweimu,qingweizhaozhaomumu";size_t len1 = strlen(buf1);printf("len1 == %lu\n", len1);// (2)、自己写的库const char buf2[256] = "wuaiyousan,riyueyuqing,riweizhao,yueweimu,qingweizhaozhaomumu";size_t len2 = MyLib_StrLen(buf2);printf("len2 == %lu\n", len2);return 0;
}
四、函数strcpy与strncpy

- 注意:
- 复制src字符串的时候,也会将'\0',一并复制到dest中
- 这两个函数的功能,都是将 src 中的字符串,复制到 dest 中。
- strcpy() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
- strncpy() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 中。
- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>// 自己写的库
/*** @brief 复制字符串* @note None * @param dest:指向目标内存,存储复制的字符串src: 指向待复制的字符串* @retval 成功:返回一个指针,指向复制后的字符串,等价于dest失败:返回NULL*/
char* MyLib_StrCpy(char *dest, const char *src)
{// 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了if ( (dest == NULL) || (src == NULL)){return NULL;}char *tmp_p = dest; // 记录dest指针最初指向的地方// 2、根据str字符串的结束符'\0',来进行移位赋值给dest内存while ( *src != '\0' ){*tmp_p = *src; // 赋值操作,将src内存里面的内容复制到dest内存中tmp_p++;src++;}// 3、返回指向dest内存的地址return dest;
}/*** @brief 复制字符串* @note None * @param dest:指向目标内存,存储复制的字符串src: 指向待复制的字符串n: 规定最多将src中的n个字符复制到dest内存中* @retval 成功:返回一个指针,指向复制后的字符串,等价于dest失败:返回NULL*/
char* MyLib_StrNCpy(char *dest, const char *src, unsigned long n)
{// 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了if ( (dest == NULL) || (src == NULL)){return NULL;}char *tmp_p = dest; // 记录dest指针最初指向的地方// 2、根据n来限定复制src字符串内容给dest内存的范围int len = strlen(src);if (n >= len){n = len;}while ( n -- ){*tmp_p = *src; // 赋值操作,将src内存里面的内容复制到dest内存中tmp_p++;src++;}// 3、返回指向dest内存的地址return dest;
}// 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库// 1、strcpy函数char dest_buf1[256] = {0}; // 目标内存1const char str_buf1[128] = "shijienameda"; // 要复制的字符串1char *p1 = strcpy(dest_buf1, str_buf1); // 有点危险,没有边界printf("dest_buf1 == %s\n", dest_buf1);printf("p1 == %s\n", p1);// 2、strncpy函数char dest_buf2[256] = {0}; // 目标内存2const char str_buf2[128] = "shijienameda"; // 要复制的字符串2char *p2 = strncpy(dest_buf2, str_buf2, 5); // 比较安全,可以控制复制的范围printf("dest_buf2 == %s\n", dest_buf2);printf("p2 == %s\n", p2);// (2)、自己写的库// 1、MyLib_StrCpy函数char dest_buf3[256] = {0}; // 目标内存1const char str_buf3[128] = "shijienameda"; // 要复制的字符串1char *p3 = MyLib_StrCpy(dest_buf3, str_buf3); // 有点危险,没有边界printf("dest_buf3 == %s\n", dest_buf3);printf("p3 == %s\n", p3);// 2、MyLib_StrNCpy函数char dest_buf4[256] = {0}; // 目标内存2const char str_buf4[128] = "shijienameda"; // 要复制的字符串2char *p4 = MyLib_StrNCpy(dest_buf4, str_buf4, 5); // 比较安全,可以控制复制的范围printf("dest_buf4 == %s\n", dest_buf4);printf("p4 == %s\n", p4);return 0;
}
五、函数strcmp与strncmp

- 注意:
- 比较字符串大小,实际上比较的是字符的 ASCII码值的大小。
- 从左到右逐个比较两个字符串的每一个字符,当能“决出胜负”时立刻停止比较。
- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>
// // 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库// 1、strcmp函数const char password1[128] = "fhq9127";char input_pw1[128] = "fhq9127";if ( strcmp(password1, input_pw1) == 0) // 两个字符串的字符都相等,返回0printf("(strcmp)密码输入正确!\n");elseprintf("(strcmp)密码输入错误!\n");// 2、strncmp函数const char password2[128] = "fhq9127";char input_pw2[128] = "fhq9128";if ( strncmp(password2, input_pw2, 3) == 0) // 两个字符串的字符都相等,返回0printf("(strcmp)密码输入正确!\n");elseprintf("(strcmp)密码输入错误!\n");return 0;
}
六、函数strcat与strncat

- 注意:
- 这两个函数的功能,都是将 src 中的字符串,复制拼接到 dest 的末尾。
- strcat() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
- strncat() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 的末尾。
- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>
// 自己写的库/*** @brief 将两个字符串拼接起来* @note None * @param dest:指向目标内存,最终存储拼接之后的字符串src: 指向需要拼接的字符串,最终将src拼接到dest的后面* @retval 成功:返回一个指针,指向拼接后的字符串,等价于dest失败:返回NULL*/
char* MyLib_StrCat(char *dest, const char *src)
{char *p1 = dest;const char *p2 = src;// 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了if ( (dest == NULL) || (src == NULL)){return NULL;}// 2、将指针p1移动到字符串末尾(这个'\0'符号的位置)while ( *p1 != '\0'){p1++;}// 3、将src字符串的字符,复制到dest中while ( *p2 != '\0'){*p1 = *p2;p1++;p2++;}// 4、补回一个'\0'字符给dest字符串*p1 = '\0';// 5、返回dest最初指向的内存位置return dest;
}/*** @brief 将两个字符串拼接起来* @note None * @param dest:指向目标内存,最终存储拼接之后的字符串src: 指向需要拼接的字符串,最终将src拼接到dest的后面n: 规定最多将src中的n个字节拼接到dest的后面* @retval 成功:返回一个指针,指向拼接后的字符串,等价于dest失败:返回NULL*/
char* MyLib_StrNCat(char *dest, const char *src, unsigned long int n)
{char *p1 = dest;const char *p2 = src;// 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了if ( (dest == NULL) || (src == NULL) || (n<=0)) {return NULL;}// 2、将指针p1移动到字符串末尾(这个'\0'符号的位置)while ( *p1 != '\0'){p1++;}// 3、将src字符串的字符,复制到dest中while ( (*p2 != '\0') && (n--)){*p1 = *p2;p1++;p2++;}// 4、补回一个'\0'字符给dest字符串*p1 = '\0';// 5、返回dest最初指向的内存位置return dest;}// 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库// 1、strcat函数char dest_buf[256] = "qingge"; // 目标字符串const char src_buf1[128] = ",nihaoshuai"; // 要拼接的字符串1const char src_buf2[128] = ",zhendejiade"; // 要拼接的字符串2char *p1 = strcat(dest_buf, src_buf1);printf("p1 == %s\n", p1);// 2、strncat函数char *p2 = strncat(dest_buf, src_buf2, 7);printf("p2 == %s\n", p2);// (2)、自己写的库// 1、MyLib_StrCat函数char dest_buf1[256] = "qingge"; // 目标字符串const char src_buf3[128] = ",nihaoshuai"; // 要拼接的字符串3const char src_buf4[128] = ",zhendejiade"; // 要拼接的字符串4char *p3 = strcat(dest_buf1, src_buf3);printf("p3 == %s\n", p3);// 2、MyLib_StrNCat函数char *p4 = MyLib_StrNCat(dest_buf1, src_buf4, 7);printf("p4 == %s\n", p4);return 0;
}
七、函数strtok

- 注意:
- 该函数会将改变原始字符串 str,使其所包含的所有分隔符变成结束标记 ‘\0’ 。
- 由于该函数需要更改字符串 str,因此 str 指向的内存必须是可写的。
- 首次调用时 str 指向原始字符串,此后每次调用 str 用 NULL 代替。
- 图解:

- 示例代码:
#include <stdio.h>
#include <string.h>
/*** @brief 将某个字符串,按照指定的分隔符拆解为子串* @note None * @param str: 指定要拆解的字符串delim: 分隔符,此处可以指定多个分隔符,形成一个分隔符串* @retval 成功:指向子串的指针失败:返回NULL,代表拆解完毕 */
char* MyLib_StrTok(char *str, const char *delim)
{static char *last_str_p = NULL; // 记住上一次调用函数时使用 last_str_p的地方;char *p1 = str;char *p2 = NULL;// 1、将上一次返回的指向,赋值给现在的strif (p1 == NULL){p1 = last_str_p;}// 2、判断输入的两个字符串是否为NULL,是的话就直接退出if ( (p1 == NULL) || (delim == NULL)){return NULL;}// 3、退出函数的准备// 判断p1是否指向了字符串的末尾,是的话退出此函数if (*p1 == '\0'){return NULL;}// 4、将str的值给p2,记录p1现在的位置p2 = p1;// 5、移动p1的位置,直到字符串结束,或者p1指针遇到分隔符delimwhile ( (*p1 != '\0') && (*p1 != *delim)){p1++;}// 6、将分隔符设置为'\0',方便字符串获取if (*p1 != '\0'){*p1 = '\0';last_str_p = p1+1; // 将位置移动下一次要分隔的字符串的首字符上}else{last_str_p = p1; // 字符串分割到末尾了,让其指向字符串末尾的'\0',方便下一次进行判断}return p2;}// 主函数
int main(int argc, char const *argv[])
{// (1)、官方写的库char dest_buf[256] = "www.yueqian.com.cn"; // 目标字符串,必须是可写内存char *p1 = strtok(dest_buf, "."); // 这里的分隔符(准确来说应该是分隔符串),是字符串,但是一般情况下以字符形式来切割while ( p1 != NULL){printf("p1 == %s\n", p1); // 不是说一定要用printf函数来表示,而是代表现在这个p1代表的子串,现在正在被我所用p1 = strtok(NULL, ".");}// (2)、自己写的库char dest_buf1[256] = "www.yueqian.com.cn"; // 目标字符串,必须是可写内存char *p2 = MyLib_StrTok(dest_buf1, "."); // 这里的分隔符(准确来说应该是分隔符串),是字符串,但是一般情况下以字符形式来切割while ( p2 != NULL){printf("p2 == %s\n", p2); // 不是说一定要用printf函数来表示,而是代表现在这个p1代表的子串,现在正在被我所用p2 = MyLib_StrTok(NULL, ".");}return 0;
}
至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!
相关文章:
12字符函数
一、函数strchr与strrchr 注意: 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。strchr() 从左往右找,strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 图解: 示例代码ÿ…...
QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发
Github Copilot是Github和OpenAI推出的AI编程辅助工具,之前版本的Github Copilot只有简单的代码自动补全,根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级,加入了Agent模式,可以实现自然语言对话讨论和最重要的&a…...
矩阵的奇异值(SVD)分解和线性变换
矩阵的奇异值(SVD)分解和线性变换 SVD定义 奇异值分解(Singular Value Decomposition,简称 SVD)是一种重要的线性代数工具,能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_rbtree_sentinel_init
ngx_rbtree_sentinel_init 定义在 src\core\ngx_rbtree.h #define ngx_rbt_black(node) ((node)->color 0) /* a sentinel must be black */#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node)初始化哨兵节点的颜色 将哨兵节点(node&a…...
数据库的sql语句
本篇文章主要用来收集项目开发中,遇到的各种sql语句的编写。 1、根据user表的role_id字段,查询role表。 sql语句:使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果:…...
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth,可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...
Bugku CTF Crypto(二)
目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官(宫) 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析:题目提示这不是md5,字符中出现了d,猜测16进制 使用…...
openssl的aes128_ECB加密解密运算实例
aes128算法ECB接口 加密接口 注意事项: EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16BEVP_EncryptUpdate加密运算,tmplen输出已加密长度EVP_EncryptFinal_ex结束运算,如果在此仍有加密运算&…...
单片机总结【GPIO/TIM/IIC/SPI/UART】
一、GPIO 1、概念 通用输入输出口;开发者可以根据自己的需求将其配置为输入或输出模式,以实现与外部设备进行数据交互、控制外部设备等功能。简单来说,GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…...
动态部署Web应用程序与web.xml配置详解
文章目录 前言一、动态部署Web应用程序1.1 什么是动态部署?1.2 动态部署的步骤1.3 动态部署的优势 二、web.xml 配置文件2.1 什么是web.xml?2.2 web.xml 文件的结构2.2.1常见配置(1) 配置上下文参数(2) 配置Servlet(3)配置过滤器(…...
Rt-thread源码剖析(1)——内核对象
前言 该系列基于rtthread-nano的内核源码,来研究RTOS的底层逻辑,本文介绍RTT的内核对象,对于其他RTOS来说也可供参考,万变不离其宗,大家都是互相借鉴,实现不会差太多。 内核对象容器 首先要明确的一点是什…...
Python 的历史进程
Python:编程世界中的瑞士军刀 在当今数字化飞速发展的时代,编程语言层出不穷,而 Python 无疑是其中一颗耀眼的明珠。它以其简洁优雅的语法、强大的功能以及广泛的应用领域,成为了全球开发者炙手可热的编程语言之一。 Python 是一种…...
十一、大数据治理平台总体功能架构
大数据治理平台的功能架构图中心主题:数据治理 核心重点是建立健全大数据资产管理框架,确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台(左侧) 此部分主要关注数据资产本身…...
STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)
定时器有四个通道,这些通道既可以用来作为输入,又可以作为输出。做输入的时候,可以使用定时器对外部输入的信号的时间参数进行测量;做输出的时候,可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…...
爬虫反爬:CSS位置偏移反爬案例分析与实战案例
文章目录 1. 反爬机制概述2. 反爬原理3. 案例分析4. 破解思路5. 实战样例样例1:使用Python和Selenium破解CSS位置偏移反爬样例2:电商网站商品列表CSS位置偏移反爬破解 6. 总结 1. 反爬机制概述 CSS位置偏移反爬是一种常见的反爬虫技术,通过C…...
libGL.so.1: cannot open shared object file: No such file or directory-linux022
in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 这个错误信息表示XXXX 在启动时遇到问题,缺少 libGL.so.1 文件。libGL.so.1 是与 OpenGL 图形库相关的共…...
向量数据库milvus部署
官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单,这里说一下遇到的问题 一:Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …...
修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板
前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...
(python)Arrow库使时间处理变得更简单
前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…...
Pytorch框架06-现有网络模型(修改/使用/保存/加载)
3.9 PyTorch网络模型的修改及使用 PyTorch 提供了多个预训练的网络模型,涵盖了广泛的计算机视觉任务,如图像分类、目标检测、语义分割等。这些预训练模型在 ImageNet 等大型数据集上进行了训练,并可以直接用于迁移学习或微调。 3.9.1 常见的…...
【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案
【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示,在编辑器内显示成img标签,二次保存视频被替换问题 问题1࿱…...
MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析
文章目录 1. COUNT() 函数的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比2.1 COUNT(*) —— 统计所有符合条件的行2.2 COUNT(1) —— 统计所有符合条件的行2.3 COUNT(column) —— 统计某一列非 NULL 的记录数 3. 性能对比3.1 EXPLAIN 分析 4. 哪种方式更好&…...
laravel11设置中文语言包
安装中文语言包 Laravel 11 默认没有内置完整中文语言包,推荐使用第三方维护的完整翻译: # 通过 Composer 安装语言包 composer require laravel-lang/common --dev# 发布中文语言文件到项目 php artisan lang:add zh_CN这会自动将中文语言文件生成到 l…...
二、IDE集成DeepSeek保姆级教学(使用篇)
各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…...
网络七层模型—OSI参考模型详解
网络七层模型:OSI参考模型详解 引言 在网络通信的世界中,OSI(Open Systems Interconnection)参考模型是一个基础且核心的概念。它由国际标准化组织(ISO)于1984年提出,旨在为不同厂商的设备和应…...
四、Redis主从复制与读写分离
一、环境搭建 准备环境 IP角色192.168.10.101Master192.168.10.102Slave192.168.10.103Slave 创建配置/数据/日志目录 # 创建配置目录 mkdir -p /usr/local/redis/conf # 创建数据目录 mkdir -p /usr/local/redis/data # 创建日志目录 mkdir -p /usr/local/redis/log修改配置…...
爬虫框架与库
爬虫框架与库是用于网络数据抓取的核心工具,帮助开发者高效地从网页中提取结构化数据。 Requests:用于发送HTTP请求。 BeautifulSoup:用于解析HTML和XML。 Scrapy:强大的爬虫框架,适合大规模爬取。 Selenium&#…...
【保姆级视频教程(二)】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!
【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...
数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全
信息化高速发展,数据已成为企业的核心资产,驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入,常态化的数据流通不仅促进了信息的快速传递与共享,还能帮助企业快速响应市场变化,把握商业机遇,实…...
本地大模型编程实战(24)用智能体(Agent)实现智能纠错的SQL数据库问答系统(3)
本文将实现这样一个 智能体(Agent) : 可以使用自然语言对 SQLite 数据库进行查询。即:用户用自然语言提出问题,智能体也用自然语言根据数据库的查询结果回答问题。增加一个自动对查询中的专有名词进行纠错的工具,这将明显提升查询…...
