【c语言】字符串常用函数组件化封装 | 字符串总结

news2024/11/17 1:30:22

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ


目录

  • 一、组件化封装的意义
  • 二、字符串相关的常用函数组件化封装:
    • 总代码文件:
      • 头文件string_pro.h:
      • 源文件string_pro.cpp
      • 用例测试:
  • 三、 本文中所有函数功能列表:
  • c语言字符串所有知识点总结:

一、组件化封装的意义

组件化封装就是将平时常用的一些函数,根据经验归纳总结到一个文件中,便于以后再次使用。

1.提升代码复用性:组件化封装可以将一些通用的、经常使用的功能和界面进行封装,以供其他模块或项目复用,减少重复工作,提升开发效率。

2.降低维护成本:组件化封装使代码模块化,一旦封装好了某一个功能或界面,就可以在不同的项目中复用。这样可以减少代码冗余,降低维护成本。

3.提高代码可读性和可维护性:不同的组件之间有着清晰的接口和依赖关系,代码的逻辑更加清晰,易于维护和扩展。

4.促进团队合作。

二、字符串相关的常用函数组件化封装:

总代码文件:

头文件string_pro.h:

#pragma once
#include <string.h>
#include <stdlib.h>
/*
功能:判断一个字符串中是否包含另一个字符串
参数:str:目标字符长串
	 substr:被查找的短字符串
返回:0 不包含 1包含
简例:int a = contains("TianXi Studio","TianXi");
返回 1;
*/
int contains(const char* str,const char *substr) ;
 
/*
功能:判断一个字符串的开头是否与另一个字符串相同
参数:str 目标字符串 substr被比较字符串
返回:0 否 1 是
简例:int a =startsWith("TianXi Studio","Tian");
返回值:1
*/
int startsWith(const char* str,const char *substr);
 
/*
功能:判断一个字符串的结尾是否与另一个字符串相同
参数:str 目标字符串 substr被比较字符串
返回:0 否 1 是
简例:int a =endsWith("TianXi Studio","Studio");
返回值:1
*/
int endsWith(const char* str,const char *substr);
 
/*
功能:从一个字符串前面寻找另一个字符串首次出现的下标
参数:str目标字符串,substr寻找字符串
返回:下标位置
简例:int a= strIndexOf("Tian Xi is coding","is");
返回值:8
*/
int strIndexOf(const char* str,const char* substr) ;
 
/*
功能:在一个字符串str前面开始寻找字符c首次出现的下标
参数:str目标字符串,c 被寻找的字符
返回:下标位置
简例:int a= charIndexOf("Tian Xi is coding",'i');
返回值:1
*/
int charIndexOf(const char* str,char c) ;
 
/*
功能:从一个字符串尾部开始寻找另一个字符串首次出现的下标
参数:str目标字符串,substr寻找字符串
返回:下标位置
简例:int a= strLastIndexOf("Tian Xi is coding","Xi");
返回值:6
*/
int strLastIndexOf(const char* str,const char* substr) ;
 
/*
功能:在一个字符串str尾部开始寻找字符c首次出现的下标
参数:str目标字符串,c 被寻找的字符
返回:下标位置
简例:int a= charLastIndexOf("Tian Xi is coding",'i');
返回值:15
*/
int charLastIndexOf(const char* str,char c) ;
 
/*
功能:判断一个字符串是否空串
参数:str被检测的字符串
返回:0 不是 1 是
简例:int a = isEmpty("");
返回值 1
*/
int isEmpty(const char* str) ;
 
/*
功能:去掉字符串中的所有空格
参数:str 需要去掉空格的字符串
返回:处理后的str
简例:
char s[] = "  Tian Xi  ";
trimAll(s)
返回值:TianXi
*/
char* trimAll(char* str) ;
 
/*
功能:只去掉字符串左侧的所有空格
参数:str: 需要去掉左侧空格的字符串
返回:处理后的str
简例:
char s[] = "  Tian Xi Studio  ";
leftTrim(s)
返回值:Tian Xi Studio  |
*/
char* leftTrim(char* str) ;
 
/*
功能:只去掉字符串右侧的所有空格
参数:str: 需要去掉右侧空格的字符串
返回:处理后的str
简例:
char s[] = "  Tian Xi Studio  ";
rightTrim(s)
返回值:  Tian Xi Studio|
*/
char* rightTrim(char* str) ;
 
/*
功能:把字符串的字母全部转换成大写
参数:str被变大写的字符串
返回:处理后的str
简例:
char s[] = "tian xi";
toUpperCase(s);
返回值: TIAN XI
*/
char* toUpperCase(char* str ) ;
 
/*
功能:把字符串的字母全部转换成小写
参数:str被变小写的字符串
返回:处理后的str
简例:
char s[] = "TIAN XI";
toUpperCase(s);
返回值: tian xi
*/
char* toLowerCase(char* str ) ;
 
/*
功能:忽略大小写字母,比较两个字符串的大小
参数:str1 str2 两个比较的字符串
返回:1 大于关系 0 等于关系 -1小于关系
简例:int a=strcmpIgnorecase("Tian xi","tian xi");
返回值:0
*/
int strcmpIgnorecase(const char* str1,const char *str2) ;
 
/*
功能:对一个字符串进行翻转
参数:str被翻转的字符串
返回:翻转处理后的str
简例:char s[] ="12345";
返回值:54321
*/
char* reserveStr(char *str);
 
/*
功能:把一个s字符串重复连接n次后存放到d字符串
参数:d最终结果字符串,s被重复的字符串 n 重复的次数
返回:d最终结果字符串
简例:char d[50];
repeat(d,"TianXi!",3);
返回值:TianXi!TianXi!TianXi!
*/
char* repeat(char* d,const char *s ,int n) ;
 
/*
功能:把一个长串中的一段字符串复制到另一个字符串。
参数:s 长串 from从 to到(但不包括) d存放位置
返回:d字符串的结果
简例:char d[20];
substr("TianXi",2,5,d);
返回值:anX
*/
char* substr(const char* s,int from ,int to,char * d) ;
 
/*
功能:把sub字符串插入到str的指定下标位置
参数:str目标字符串 sub被插入的子串 index 插入点下标。
返回:处理后的str
简例:
char s[50]="TianXi coding";
insert(s,"is ",6);
返回值:TianXi is coding
*/
char* insert(char* str,const char *sub,int index) ;
 
/*
功能:把字符串中指定下标的字符删除掉
参数:str目标字符串,index 被删除下标
返回:处理后的str
简例:char s[]="Tian Xi";
	deleteCharAt(s,1);
返回值:Tan Xi
*/
char* deleteCharAt(char* str,int index) ;
 
/*
功能:把str字符串中的一段字符删除掉
参数:str被删除的字符串 from删除开始点 to 结束点(但不包括)
返回:处理后的str
简例:
char s[]="Tian Xi";
deleteSubstr(s,0,5);
返回值:xi
*/
char* deleteSubstr(char* str,int from ,int to) ;
 
/*
功能:把字符串str的一小段字符替换成另一个字符串sub
参数:str目标字符串 from起始点,to结束点(但不包括) sub替换的内容
返回:处理后的str
简例:
char s[50]="Tian Xi";
replace(s,2,4,"xi");
返回值:Tixi Xi
*/
char* replace(char* str,int from ,int to,const char * sub); 
 
/*
功能:把字符串str中的某些部分替换成另外的字符串
参数:str目标字符串 oldsub原来的内容 newsub 新的内容
返回:处理后的str
简例:
char s[50]="Tian Xi Studio";
replaceAll(s,"Studio","is coding");
返回值:Tian xi is coding
*/
char* replaceAll(char* str,const char *oldsub,const char* newsub) ;

源文件string_pro.cpp

#include "string_pro.h"
/*
功能:判断一个字符串中是否包含另一个字符串
参数:str:目标字符长串
	 substr:被查找的短字符串
返回:0 不包含 1包含
简例:int a = contains("TianXi Studio","TianXi");
返回 1;
*/
int contains(const char* str, const char* substr)
{
	return strstr(str, substr) != NULL;
}

/*
功能:判断一个字符串的开头是否与另一个字符串相同
参数:str 目标字符串 substr被比较字符串
返回:0 否 1 是
简例:int a =startsWith("TianXi Studio","Tian");
返回值:1
*/
int startsWith(const char* str, const char* substr)
{
	return strstr(str, substr) == str;
}

/*
功能:判断一个字符串的结尾是否与另一个字符串相同
参数:str 目标字符串 substr被比较字符串
返回:0 否 1 是
简例:int a =endsWith("TianXi Studio","Studio");
返回值:1
*/
int endsWith(const char* str, const char* substr)
{
	return strstr(str , substr)== str + strlen(str)-strlen(substr);
}

/*
功能:从一个字符串前面寻找另一个字符串首次出现的下标
参数:str目标字符串,substr寻找字符串
返回:下标位置
简例:int a= strIndexOf("Tian Xi is coding","is");
返回值:8
*/
int strIndexOf(const char* str, const char* substr)
{
	return strstr(str, substr) - str;
}


/*
功能:在一个字符串str前面开始寻找字符c首次出现的下标
参数:str目标字符串,c 被寻找的字符
返回:下标位置
简例:int a= charIndexOf("Tian Xi is coding",'i');
返回值:1
*/
int charIndexOf(const char* str, char c)
{
	for (int i = 0; i < strlen(str); i++)
	{
		if (str[i] == c)
		{
			return i;
		}
	}
	return -1;
}

/*
功能:从一个字符串尾部开始寻找另一个字符串首次出现的下标
参数:str目标字符串,substr寻找字符串
返回:下标位置
简例:int a= strLastIndexOf("Tian Xi is coding","Xi");
返回值:6
*/
int strLastIndexOf(const char* str, const char* substr)
{
	return strstr(str, substr) - str;
}

/*
功能:在一个字符串str尾部开始寻找字符c首次出现的下标
参数:str目标字符串,c 被寻找的字符
返回:下标位置
简例:int a= charLastIndexOf("Tian Xi is coding",'i');
返回值:15
*/
int charLastIndexOf(const char* str, char c)
{
	for (int i = strlen(str); i > 0; i--)
	{
		if (str[i] == c)
		{
			return i;
		}

	}
	return 0;
	//method 2
//char t[2] = {c};
//return strLastIndexOf(str,t);
}

/*
功能:判断一个字符串是否空串
参数:str被检测的字符串
返回:0 不是 1 是
简例:int a = isEmpty("");
返回值 1
*/
int isEmpty(const char* str)
{
	return *str =='\0';
}

/*
功能:去掉字符串中的所有空格
参数:str 需要去掉空格的字符串
返回:处理后的str
简例:
char s[] = "  Tian Xi  ";
trimAll(s)
返回值:TianXi
*/
char* trimAll(char* str)
{
	char* p = str;
	int len = 0;
	while (*p)
	{
		if (*p != ' ')
		{
			str[len++] = *p;
		}
		p++;
	}
	str[len] = '\0';//清除后面内容
	return str;
}

/*
功能:只去掉字符串左侧的所有空格
参数:str: 需要去掉左侧空格的字符串
返回:处理后的str
简例:
char s[] = "  Tian Xi Studio  ";
leftTrim(s)
返回值:Tian Xi Studio  |
*/
char* leftTrim(char* str)
{
	char* p = str;
	while (*p)
	{
		if (*p == ' ')
		{
			p++;
		}
	}
	return strcpy(str, p);
}

/*
功能:只去掉字符串右侧的所有空格
参数:str: 需要去掉右侧空格的字符串
返回:处理后的str
简例:
char s[] = "  Tian Xi Studio  ";
rightTrim(s)
返回值:  Tian Xi Studio|
*/
char* rightTrim(char* str)
{
	char* p = str + strlen(str) - 1;
	while (*p ==' ')
	{
		p--;
		*(p + 1) = '\0';
	}
	return str;
}

/*
功能:把字符串的字母全部转换成大写
参数:str被变大写的字符串
返回:处理后的str
简例:
char s[] = "tian xi";
toUpperCase(s);
返回值: TIAN XI
*/
char* toUpperCase(char* str)
{
	char* p = str;
	while (*p)
	{
		if (*p >= 'a' && *p <= 'Z')
		{
			*p -= 32;
		}
		p++;
	}
	return str;
}

/*
功能:把字符串的字母全部转换成小写
参数:str被变小写的字符串
返回:处理后的str
简例:
char s[] = "TIAN XI";
toUpperCase(s);
返回值: tian xi
*/
char* toLowerCase(char* str)
{
	char* p = str;
	while (*p)
	{
		if (*p >= 'A' && *p <= 'Z')
		{
			*p += 32;
		}
		p++;
	}
	return str;
}

/*
功能:忽略大小写字母,比较两个字符串的大小
参数:str1 str2 两个比较的字符串
返回:1 大于关系 0 等于关系 -1小于关系
简例:int a=strcmpIgnorecase("Tian xi","tian xi");
返回值:0
*/
int strcmpIgnorecase(const char* str1, const char* str2)
{

	char* p1 = (char*)malloc(sizeof(char) * strlen(str1) + 1);	//+1是因为'\0'
	strcpy(p1, str1);
	toUpperCase(p1);  //忽略大小写:统一变成大写

	char* p2 = (char*)malloc(sizeof(char) * strlen(str2) + 1);	//+1是因为'\0'
	strcpy(p2, str1);
	toUpperCase(p2);

	int res = strcmp(p1, p2);
	free(p1);
	free(p2);
	return res;
}

/*
功能:对一个字符串进行翻转
参数:str被翻转的字符串
返回:翻转处理后的str
简例:char s[] ="12345";
返回值:54321
*/
char* reserveStr(char* str)
{
	char t;
	for (char* p = str, *q = str + strlen(str) - 1; q > p; p++, q--)
	{
			t = *p;
			*p = *q;
			*q = t;
		
	}
	return str;
}

/*
功能:把一个s字符串重复连接n次后存放到d字符串
参数:d最终结果字符串,s被重复的字符串 n 重复的次数
返回:d最终结果字符串
简例:char d[50];
repeat(d,"TianXi!",3);
返回值:TianXi!TianXi!TianXi!
*/
char* repeat(char* d, const char* s, int n)
{
	d[0] = '\0';
	for (int i = 0; i < n; i++)
	{
		strcat(d, s);
	}
	return d;
}

/*
功能:把一个长串中的一段字符串复制到另一个字符串。
参数:s 长串 from从 to到(但不包括) d存放位置
返回:d字符串的结果
简例:char d[20];
substr("TianXi",2,5,d);
返回值:anX
*/
char* substr(const char* s, int from, int to, char* d)
{
	int len;
	for (len = 0; len < to - from; len++)
	{
		d[len] = s[from + len];
	}
	d[len] = '\0';
	return d;
}

/*
功能:把sub字符串插入到str的指定下标位置
参数:str目标字符串 sub被插入的子串 index 插入点下标。
返回:处理后的str
简例:
char s[50]="TianXi coding";
insert(s,"is ",6);
返回值:TianXi is coding
*/
char* insert(char* str, const char* sub, int index)
{
	char* p = str + index;
	char* temp = (char*)malloc(sizeof(char) * (strlen(p) + 1));
	if (temp)
	{
		strcpy(temp, p);
		*p = '\0';
		strcat(str, sub);
		strcat(str, temp);
		free(temp);
	}
	return str;
}

/*
功能:把字符串中指定下标的字符删除掉
参数:str目标字符串,index 被删除下标
返回:处理后的str
简例:char s[]="Tian Xi";
	deleteCharAt(s,1);
返回值:Tan Xi
*/
char* deleteCharAt(char* str, int index)
{
	return strcpy(str + index, str + index + 1);
}

/*
功能:把str字符串中的一段字符删除掉
参数:str被删除的字符串 from删除开始点 to 结束点(但不包括)
返回:处理后的str
简例:
char s[]="Tian Xi";
deleteSubstr(s,0,5);
返回值:xi
*/
char* deleteSubstr(char* str, int from, int to)
{
	return strcpy(str + from, str + to);
}

/*
功能:把字符串str的一小段字符替换成另一个字符串sub
参数:str目标字符串 from起始点,to结束点(但不包括) sub替换的内容
返回:处理后的str
简例:
char s[50]="Tian Xi";
replace(s,2,4,"xi");
返回值:Tixi Xi
*/
char* replace(char* str, int from, int to, const char* sub)
{
	deleteSubstr(str, from, to);
	return insert(str, sub, from);
}

/*
功能:把字符串str中的某些部分替换成另外的字符串
参数:str目标字符串 oldsub原来的内容 newsub 新的内容
返回:处理后的str
简例:
char s[50]="Tian Xi Studio";
replaceAll(s,"Studio","is coding");
返回值:Tian xi is coding
*/
char* replaceAll(char* str, const char* oldsub, const char* newsub)
{
	char* p = str;
	int from, to;
	do
	{
		p = strstr(p, oldsub);
		if (p)
		{
			from = p - str;
			to = from + strlen(oldsub);
			replace(str, from, to, newsub);
		}
	} while (p != NULL);
	return str;
}

用例测试:

#include <stdio.h>
#include "string_pro.h"
#include <iostream>
using namespace std;
int main ()
{
	//int a = contains("TianXi Studio", "TianXi");

	//a = startsWith("TianXi Studio", "Tian");

	//a = endsWith("TianXi Studio", "Studio");

	//a = strIndexOf("Tian Xi is coding", "is");

	//printf("%d\n", a);
	//char s[] = "12345";
	char d[50];
	printf("%s\n", repeat(d, "TianXi!", 3));
	return 0;
}

就是再同一项目下建立一个测试用的文件,输入函数的定义进行功能测试:

如果达到了预期效果,该函数就是编写成功

在这里插入图片描述

三、 本文中所有函数功能列表:

  • contains:判断一个字符串中是否包含另一个字符串
  • startsWith:判断一个字符串的开头是否与另一个字符串相同
  • endsWith:判断一个字符串的结尾是否与另一个字符串相同
  • strIndexOf:从一个字符串前面寻找另一个字符串首次出现的下标
  • charIndexOf:在一个字符串前面开始寻找字符首次出现的下标
  • strLastIndexOf:从一个字符串尾部开始寻找另一个字符串首次出现的下标
  • charLastIndexOf:在一个字符串尾部开始寻找字符首次出现的下标
  • isEmpty:判断一个字符串是否为空串
  • trimAll:去掉字符串中的所有空格
  • leftTrim:只去掉字符串左侧的所有空格
  • rightTrim:只去掉字符串右侧的所有空格
  • toUpperCase:把字符串的字母全部转换成大写
  • toLowerCase:把字符串的字母全部转换成小写
  • strcmpIgnorecase:忽略大小写字母,比较两个字符串的大小关系
  • reserveStr:对一个字符串进行翻转
  • repeat:把一个字符串重复连接n次后存放到另一个字符串
  • substr:从一个长串中的一段字符串复制到另一个字符串。
  • insert:把sub字符串插入到str的指定下标位置
  • deleteCharAt:把字符串中指定下标的字符删除掉
  • deleteSubstr:把str字符串中的一段字符删除掉
  • replace:把字符串str的一小段字符替换成另一个字符串

本字符串函数功能组件可以被复用在平时的项目中。

如果有新的本人常用的字符串相关函数,我将会进行更新

c语言字符串所有知识点总结:

字符串的基本概念 | 字符串存储原理
字符串输出方式 | API仿真
字符串计算长度 | API仿真
字符串复制 | API仿真
字符串拼接 | API仿真
字符串比较 | API仿真
字符串匹配(搜索) | API仿真
字符串类型转换 | itoa函数的使用
字符串知识实现登录demo | 账号密码验证功能


大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。

在这里插入图片描述

大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript】9.事件

事件 1. 注册事件&#xff08;绑定事件&#xff09; 给元素添加事件&#xff0c;称为注册事件或者绑定事件 1.1 注册事件两种方式 传统注册方式&#xff08;onclick&#xff09; 传统方式注册事件特点&#xff1a; 注册事件的唯一性同一个元素同一个事件只能设置一个处理函数…

离了大谱,公司测试岗却新来了个00后卷王,3个月薪资干到20K.....

最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会&#xff0c;不断提升自己的技能栈成了测试老人迫在眉睫的问题。 不论是面试哪个级别的测试工程师&#xff0c;面试官都会问一句“会编程吗&#xff1f;有没有自动化测试…

spring-web HandlerAdapter 源码分析

说明 本文基于 jdk 8, spring-framework 5.2.x 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 HandlerAdapter 接口 提供作为处理器适配器的能力。 supports 方法判断是否支持该 handler。 public interface HandlerAdapter {/*** 判断是否…

【跟着陈七一起学C语言】今天总结:初识C语言

友情链接&#xff1a;专栏地址 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的错误&#x…

Ansys Zemax | 设计抬头显示器时要使用哪些工具 – 第二部分

本文为使用OpticStudio工具设计优化HUD抬头显示器系统的第二部分&#xff0c;主要包含演示了如何使用OpticStudio工具设计分析抬头显示器&#xff08;HUD&#xff09;性能&#xff0c;即全视场像差&#xff08;FFA&#xff09;和NSC矢高图。&#xff08;联系我们获取文章附件&a…

RabbitMQ之工作队列 ( Work Queues )

Work Queues 1. 轮询分发消息1.1 抽取工具类1.2 启动两个工作线程1.3 启动一个发送线程1.4 结果展示 2. 消息应答2.1 概念2.2 自动应答2.3 消息应答的方法2.4 Multiple 的解释2.5 消息自动重新入队2.6 消息手动应答代码2.7 手动应答效果演示 3. RabbitMQ 持久化3.1 概念3.2 队列…

逍遥自在学C语言 | 条件控制的正确使用姿势

前言 在C语言中&#xff0c;有三种条件判断结构&#xff1a;if语句、if-else语句和switch语句。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、if语句 基本语法 if (条…

大厂过来人忠告:学java有没有前途?想转行应该准备什么?

对于想转行学习java来人说&#xff0c;最可怕的问题就是信息闭塞。很多人开始的时候都是因为没能了解清楚情况&#xff0c;找不到学习思路&#xff0c;胡乱下手学习一通其实效果并不好&#xff0c;只是感动了自己&#xff0c;没有太大成效。毕竟时间这么宝贵&#xff0c;你也不…

ThingsBoard教程(四十):规则节点解析 计算增量节点 Calculate delta

本篇文章介绍一个ThingsBoard 规则引擎中的一个节点,Calculate delta Calculate delta 计算增量 该节点可以在规则中获取上一次遥测的值,以此可以实现二次遥测的差。比如一个设备,一天上传一次数据,如果你要对比今天和昨天的数据,并将两者数据差保存到数据库,就能够使用…

三子棋游戏的实现(C语言)

三子棋游戏的实现&#xff0c;在这里我们要求满足&#xff1a; 游戏不退出&#xff0c;继续下一把&#xff08;循环&#xff09;用多文件的形式实现&#xff0c;如下&#xff1a; 用game.h文件存放函数的声明并包含需要的头文件用game.c文件存放各个函数的具体实现用test.c文件…

【Linux】Keepalived+Haproxy实现数据库集群负载均衡

1、简介&#xff1a; 本文章的负载均衡和高可用是体现在两个从服务器上的。一般来说高可用是用在主服务器中的&#xff0c;例如双主多从的结构&#xff0c;双主做keepalived的高可用&#xff08;当然也可以加上haproxy做负载均衡&#xff09;&#xff0c;多从做haproxy的负载均…

微盟餐饮SaaS蜕变时刻:战略投资奥琦玮,领军之势已成

从火爆了整个春天的淄博烧烤&#xff0c;到“五一”人山人海的全国各地核心商圈&#xff0c;餐饮业热度狂飙不止。餐饮SaaS领域&#xff0c;大事件也在发生。 5月8日&#xff0c;微盟集团&#xff08;2013.HK&#xff09;宣布以“资产现金”方式&#xff0c;向餐饮行业数字化服…

前端get请求参数包含数组的情况

前端get请求参数包含数组的情况 问题描述解决办法文章参考 问题描述 当我们使用post传数组参数的时候&#xff0c;是没有问题的&#xff0c;可以不经过参数处理即可正常传参&#xff0c;但是当我们使用get请求传数组参数的时候&#xff0c;会出现下图这样的情况&#xff1a; a…

如何通过云平台加快Blender渲染?

Blender是一款专业自由及开放源代码的三维计算机图形软件&#xff0c;也是免费的开源3D创作套件&#xff0c;支持整个3D流程——建模、UV、贴图、材质、骨骼、动画、渲染、后期、合成、剪辑、跟踪和抠像等等&#xff0c;CG行业内也有不少大佬们通过Blender制作出了许多优秀作品…

代码随想录 LeetCode数组篇 螺旋矩阵II Java实现

文章目录 &#xff08;中等&#xff09;59. 螺旋矩阵II&#xff08;中等&#xff09;54. 螺旋矩阵&#xff08;简单&#xff09;JZ29 顺时针打印矩阵 &#xff08;中等&#xff09;59. 螺旋矩阵II 因为我是先做的JZ29&#xff0c;所以看到这题的时候&#xff0c;几乎就是一样的…

SpringCloud入门实战之项目(一)

一、新建父工程 以“下单”需要调“支付”模块为例&#xff0c;从零开始搭建springcloud-001项目&#xff0c;陆续集成相关组件。 新建服务提供者cloud-payment工程&#xff0c;服务调用者cloud-order工程&#xff0c;完成order对payment的调用。 只留下pom文件&#xff0c;其…

基于人工智能AI视频分析的智慧安监解决方案

方案背景 为了保证对园区环境风险进行有效识别&#xff0c;传统视频监控存在视频结构化利用率低的问题&#xff0c;在实际使用过程中&#xff0c;安全管理人员工作效率低下&#xff0c;依靠人工肉眼查看灵活度低&#xff0c;风险漏报概率高&#xff0c;出现异常情况跟踪不及时&…

中文润色神器-中文润色软件

中文写作润色软件 中文写作润色软件是一种基于自然语言处理技术和人工智能算法的工具&#xff0c;旨在提高中文文本的语言风格、表达能力和可读性。它可以自动检测文本中出现的语法、拼写、标点符号等语言问题&#xff0c;并给出相应的修正和修改建议。 中文写作润色软件的主…

paddleLite在Android部署初体验(环境问题)

paddleLite初体验&#xff08;环境问题&#xff09; Android Studio下载Paddle Lite Demo打开项目环境配置下载到手机 Paddle Lite是百度开发的一种方便部署的深度学习推理框架&#xff0c;笔者最近想接触一些模型部署相关项目&#xff0c;就先接触了一下Paddle Lite&#xff0…

手术麻醉信息系统源码 php + mysql + vue2,覆盖患者就诊全过程,体征数据自动采集绘制

手术麻醉信息系统源码 php mysql vue2 B/S网页版 麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术…