【C进阶】 字符串函数和字符分类函数

news2025/1/11 12:40:18

家人们欢迎来到小姜的世界,<<点此>>传送门 这里有详细的关于C/C++/Linux等的解析课程,家人们赶紧冲鸭!!!
客官,码字不易,来个三连支持一下吧!!!关注我不迷路!!!

字符串函数和字符分类函数

  • 前言
  • 一、strlen
    • (一)介绍
    • (二)模拟实现
  • 二、strcpy
    • (一)介绍
    • (二)模拟实现
  • 三、strcat
    • (一)介绍
    • (二)模拟实现
    • (三)有趣的知识
  • 四、strcmp
    • (一)介绍
    • (二)模拟实现
  • 五、strncpy
    • (一)介绍
    • (二)模拟实现
  • 六、strncat
    • (一)介绍
    • (二)模拟实现
  • 七、strncmp
    • (一)介绍
    • (二)模拟实现
  • 八、strstr
    • (一)介绍
    • (二)模拟实现
  • 九、strtok
    • (一)介绍
    • (二)模拟实现
  • 十、strerror
    • (一)介绍
    • (二)使用
    • (三)perror
  • 十一字符分类函数(头文件:<ctype.h>)
  • 十二、字符转换
  • 总结


前言

本文的重点是以下几个字符函数和字符串函数:
在这里插入图片描述
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数.


一、strlen

在之前的博客中细细分析过,大家可以先去看一看实现的形式,下面的各个形式也同样是概况与拓展。
传送门<<点此>>

(一)介绍

1.字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,是无符号的
4.学会strlen函数的模拟实现

建议大家使用size_t表示无符号整型:
如下代码事例:

#include<stdio.h>
int main() {
	if (strlen("abc") - strlen("abcdef")) {
		printf(">\n");
	}
	else {
		printf("<=\n");
	}
	return 0;
}

大家可以想一想上面这串代码输出的应该是什么?3-6=-3,应该输出的是<=对吧,可是我们编译看一下结果:
在这里插入图片描述

这怎么输出的是>!?原来是strlen的返回值是size_t,在计算机内部存储的是二进制的补码,而-3转化称为补码以后存储计算机中,可是计算机在取出的时候拿到的是无符号整形,不看符号位的,所以是一个很大很大的正数,所以是>。

(二)模拟实现

我们之前也了解过模拟实现,那我们直接给代码,其中有三种模拟形式,第一种就是常规的解法,是用指针从开始往后一直指到’\0’,第二种就是利用递归思想,第三种就是指针减指针的方法。

#include<assert.h>
#include<stdio.h>

//size_t == typedef unsigned int size_t
//法3
//指针-指针
size_t my_strlen(const char* str) {
	assert(str);
	const char* start = str;//定义首指针
	while (*str) {
		str++;
	}
	return str - start;//计算长度
}

//法2
//递归思想
size_t my_strlen(const char* str) {
	assert(str);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

//法1
//常规思路,往后加1找大小
size_t my_strlen(const char* str) {
	assert(str);
	int count = 0;
	while (*str) {
		str++;
		count++;
	}
	return count;
}

int main() {
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

二、strcpy

在之前的博客中细细分析过,大家可以先去看一看实现的形式,下面的各个形式也同样是概况与拓展。
<<点此>>传送门

(一)介绍

在这里插入图片描述
1.源字符串必须以 ‘\0’ 结束。 ---- 将strSource中一直到’\0’之前的字符以及’\0’拷贝到strDestination,所以一定要有’\0’。
2.会将源字符串中的 ‘\0’ 拷贝到目标空间。 — 从strSource中的所有字符包括’\0’都拷贝上去。
3.目标空间必须足够大,以确保能存放源字符串。 — 被拷贝的空间一定要是足够大的空间能够存放拷贝的字符串。
4.目标空间必须可变。— 如果给的是一个常量字符串那肯定用不了strcpy了,只有数组是可变的才能用strcpy。

(二)模拟实现

直接上代码:

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src) {
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++) {
		;
	}
	return dest;
}

int main() {
	char arr1[20] = "*************";
	char arr2[] = "abcdef";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

三、strcat

(一)介绍

大家肯定可以发现的是,strcpy和strcat两个库函数是一模一样的,一个是拷贝过去,另一个是追加字符串。
在这里插入图片描述
先来了解一下这个函数的构成:
在这里插入图片描述
那根据这个函数的构成我们进行写一下追加吧!
在这里插入图片描述
既然要追加是怎么追加的呢?是从目标指针的’\0’开始追加的,那也就是说两个字符串数组都是需要’\0’的,被追加的字符串能有个尾巴被追加,追加过去的那个字符串能找到尾巴追加过去并在把’\0’拷贝过去以后能结束,停止拷贝,如下图:
在这里插入图片描述
所以总结一下:
1.源字符串必须以 ‘\0’ 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。

(二)模拟实现

我们在了解了这些概念了以后,我们能够进行模拟实现,它第一步是需要将目标指针移动到它的’\0’处,再进行追加,是不是很简单呢?那我们直接给出代码:

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest, char* src) {
	assert(dest && src);
	char* ret = dest;
	//1.找到目标空间的'\0'
	while (*dest != '\0') {
		dest++;
	}
	//2.追加
	while (*dest++ = *src++) {
		;
	}
	return ret;
}

int main() {
	char arr[20] = "hello ";
	char arr1[] = "world!";
	//char* p = "world!";
	my_strcat(arr, arr1);
	printf("%s\n", arr);
	return 0;
}

(三)有趣的知识

strcat库函数能够进行追加字符串,那它自己追加自己呢?答案是死循环,如下图解释:
在这里插入图片描述
当我们将dest指针往后移动找’\0’的时候,发现找到了,挺开心的,src和dest两个指针一起往后运动,当src指针运动到f的尾部,想这下子我可以美美完成工作睡大觉了,可是发现,这咋没’\0’呢!?震惊了,跟自己说,不灰心,往后找找肯定有的,但是找来找去发现没有’\0’,dest指针也纳闷了,这娃子咋让我一直走,不带停歇的呢?系统崩溃了,这时候系统和这两个指针说,你们虽然在完成任务,可是你看,dest你把人src的\0给覆盖掉了,把墙给拆了,src找不到南墙回不了头呀!!!这时候我们就知道了,dest在往后找完后进行覆盖的时候,首当其冲把’\0’给覆盖了这怪不得会死循环。


四、strcmp

在之前的博客中细细分析过,大家可以先去看一看实现的形式,下面的各个形式也同样是概况与拓展。
传送门<<点此>>

(一)介绍

标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
在这里插入图片描述
简单实现:
在这里插入图片描述

ps:在VS环境下,>返回1,<返回-1,=返回0。

比较形式:
在这里插入图片描述

(二)模拟实现

指针相等则两个指针往后移动,但不要忘记的是当在函数内部指针是等于’\0’的时候,是这两个字符串相等,而跳出循环发现指针解引用哪个ASCII码值大就是那个大。

//VS环境下
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	while (*str1 == *str2) {
		if (*str1 == '\0' && *str2 == '\0') {//两个字符串相等的时候
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abq";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

改进:

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	while (*str1 == *str2) {
		if (*str1 == '\0' && *str2 == '\0') {//两个字符串相等的时候
			return 0;
		}
		str1++;
		str2++;
	}
	/*if (*str1 > *str2)
		return 1;
	else
		return -1;*/
	return *str1 - *str2;
}
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abq";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

五、strncpy

(一)介绍

我们在进行完strcpy的讲解相信大家对这个函数有了比较简单的了解,但那些函数长度不受限制,你可以随意拷贝字符串是非常不安全的,那我们即将介绍strncpy这个库函数,是长度受到限制的库函数。
1.拷贝num个字符从源字符串到目标空间。
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
以下是简单介绍:
在这里插入图片描述
有了以上的概念,我们使用这个函数试一试吧!
在这里插入图片描述
这拷贝的是hel过去,但后面还有那么多xxx没有被替代,这是很好理解的,我只需要改变这几个字符,其他字符不改变呀!
那可能大家想了,那我调皮一下,我给的数比字符串长度要长呢?输出的是什么?那万变不离调试,我们试一试调试吧!
在这里插入图片描述
这已经有\0了,那就后面的都没了,到\0之前即可。

(二)模拟实现

只要多一个num–即可。

#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* src, size_t num) {
	assert(dest && src);
	char* ret = dest;
	while (num--) {
		*dest++ = *src++;
	}
	return ret;
}
int main() {
	char arr1[20] = "xxxxxxxx";
	char* ret = my_strncpy(arr1, "hello world!", 3);
	printf("%s\n", arr1);
	return 0;
}

六、strncat

(一)介绍

在介绍完strcat以后,大家肯定对追加字符串有了较为基础的了解,那我们再来讲解一下strncat吧!
在这里插入图片描述
有了上面的概念,我们来简单使用一下它吧!
在这里插入图片描述
那前面我们讲了strncpy不会增加个\0,那strncat呢?它是会增加一个\0的,我们进入调试看看:
在这里插入图片描述

(二)模拟实现

不仅仅要加个num–循环,更要知道的是\0后面的值都舍弃掉。

#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, char* src, size_t num) {
	assert(dest && src);
	char* ret = dest;
	//1.找到目标空间的'\0'
	while (*dest != '\0') {
		dest++;
	}
	//2.追加
	while (num--) {
		*dest++ = *src++;
	}
	*dest = 0;//\0后面的值都不要,'\0'的ASCII码值为0
	return ret;
}
int main() {
	char arr[20] = "hello\0xxxxxxx";
	char* ret = my_strncat(arr, "world!", 4);
	printf("%s\n", arr);
	return 0;
}

七、strncmp

(一)介绍

在介绍完strcmp后,这个strncmp仅仅比strcmp多了个数,那我们先了解再实现吧!
在这里插入图片描述
有了上面的概念,我们来简单使用一下它吧!
在这里插入图片描述

(二)模拟实现

依旧是用num–循环。

#include<stdio.h>
#include<assert.h>
int my_strncmp(char* str1, char* str2, int num) {
	assert(str1 && str2);
	while (num--) {
		if (*str1 == *str2) {
			str1++;
			str2++;
		}
		else {
			if (*str1 > *str2) {
				return 1;
			}
			else {
				return -1;
			}
		}
	}
	return 0;
}
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abqwq";
	int ret = my_strncmp(arr1, arr2, 3);
	printf("%d\n", ret);
	return 0;
}

八、strstr

(一)介绍

strstr库函数简单来讲就是找在第一个字符串找有没有第二个字符串的地址,有则返回第一个出现的字符串的位置,无则返回空指针。
在这里插入图片描述
那有了上面的概念,我们进行简单实现吧!
在这里插入图片描述

(二)模拟实现

我们发现是有两种情况的,第一种情况是第一次往后找字符串就找到了然后与第二个字符串匹配,第二种情况是找第一次不匹配,找第二次才匹配。
在这里插入图片描述
那我们先来分看一下第一种情况的实现吧!
在这里插入图片描述

再看一下第二种情况吧!
思路是用两个指针代替原本的指针运动,后续元素不匹配,那就重新跳回去继续找即可。
在这里插入图片描述
解题代码如下:

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2) {
	assert(str1 && str2);
	//空字符串找不到,但输出是第一个字符串
	if (*str2 == '\0') {
		return str1;
	}
	//找替代的指针让它们去走
	const char* sp1 = str1;
	const char* sp = str2;
	//cp去储存每次str1与str2两个一样的地址
	const char* cp = str1;

	while (*cp) {
		//碰到一样元素后续不一样sp1先回来,再往后走一位
		//找不到sp永远是处在str2(首地址)的位置
		sp1 = cp;
		sp = str2;
		while (*sp1!='\0' && *sp!='\0' && *sp1 == *sp) {//判断都不是走到末尾
			sp1++;
			sp++;
		}
		if (*sp == '\0') {//第二个字符串走到头
			return cp;
		}
		cp++;
	}
	return NULL;

}
int main() {
	char arr1[] = "abbbbcedf";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL) {
		printf("找不到\n");
	}
	else {
		printf("找到了,是%s\n", ret);
	}
	return 0;
}

九、strtok

(一)介绍

这是个很怪的库函数,简单来说就是分隔符的集合,下面是strtok的简单介绍,我也会用代码的形式一步步解析定义:
在这里插入图片描述
在这里插入图片描述
我们要了解的是这个strtok是会永久替换替换符的,那我们就需要再加一个数组去当个影子参与替换。
在这里插入图片描述
当我们找到第一个字符串以后也是需要往后找其他的字符串,那这个有讲究了,是需要NULL空指针当做第一个元素的,因为strtok会记下分割符转换成为’\0’的位置。
在这里插入图片描述
代码:

#include<stdio.h>
#include<string.h>
int main() {
	char arr[] = "hello/world,nihao/wendang";//分隔符是,/
	char* p = ",/";
	char strDest[30] = { 0 };
	strcpy(strDest, arr);
	char* ret = strtok(strDest, p);
	printf("%s\n", strDest);
	printf("%s\n", arr);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	return 0;
}

这写的有点费时间,如果有几百个串是不是很浪费时间,那就需要进行循环了:

#include<stdio.h>
#include<string.h>
int main() {
	char arr[] = "hello/world,nihao/wendang";//分隔符是,/
	char* p = ",/";
	char strDest[30] = { 0 };
	strcpy(strDest, arr);
	char* ret = NULL;
	for(ret = strtok(strDest, p); ret != NULL; ret = strtok(NULL, p)) {
		printf("%s\n", ret);
	}

	return 0;
}

在这里插入图片描述

(二)模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>

char* my_strtok(char* strToken, const char* strDelimit){
	assert(strDelimit && strDelimit);
	static char* s1 = NULL;//静态变量,之后再进来的时候可以接着原本的值使用
	static char* s2 = NULL;
	static int len1 = 0;
	static int count = 0;
	int len2 = 0;
	int i = 0;
	if (strToken) { //第一个字符不等于'\0'             
		s1 = strToken;                          
		len1 = strlen(strToken);
		len2 = strlen(strDelimit);
		 while(*strToken != '\0'){//解引用以后拿到的字符不等于'\0'
			for (i = 0; i < len2; i++) {
				if (i == 0){
					count++;
				}
				if (*strToken == *(strDelimit + i)){
					*strToken = '\0'; //找到了那个分隔符,就将这个分隔符内容赋为0           
					s2 = strToken;               
					return s1;//返回头指针
				}
			}
			strToken++;
		 }
	}
	else{
		s1 = s2 + 1; //s1去移动,s2不用运动                  
		len2 = strlen(strDelimit);
		strToken = s1;                           
		while(*strToken != '\0'){
			for (i = 0; i < len2; i++){
				if (i == 0){
					count++;
				}
				if (*strToken == *(strDelimit + i)){
					*strToken = '\0';   //找到了那个分隔符,就将这个分隔符内容赋为0         
					s2 = strToken;
					return s1;
				}
			}
			strToken++;
		}
	}
	if (count > len1){//要是
		return NULL;
	}
	return s1;
}

int main(){
	char arr1[] = "hello/world,nihao/wendang";
	char arr2[] = "/,";
	char* str = NULL;
	for (str = my_strtok(arr1, arr2); str != NULL; str = my_strtok(NULL, arr2)){//进入循环,不断的返回
		printf("%s\n", str);
	}
	return 0;
}

十、strerror

(一)介绍

在这里插入图片描述
C语言的库函数在运行的时候,如果发生错误,就会将错误码存放在一个变量中,这个变量是errno,错误码是一些数字,所以我们需要将错误码翻译成错误信息,返回错误码所对应的错误信息。
举个例子:
在这里插入图片描述
如图,这个函数是用于返回errnum所对应的错误信息的,而这些错误信息是C语言中库函数报错的时候的错误码。

(二)使用

在我们使用这个库函数的时候,我们需要先认识了解一下fopen库函数:在这里插入图片描述
这个有点提前了,那也需要在这里说明一下,如下代码:

#include<stdio.h>
#include<errno.h>
int main() {
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		printf("%s\n",strerror(errno));//errno是用来保存错误信息,strerror是用来进行译码
		return 1;
	}
	//读文件
	//关闭文件
	fclose(pf);//释放
	pf = NULL;

	return 0;
}

我们仅仅看这个strerror库函数即可,现在告诉你,这个文件是没有的,所以当我打开一个不存在的文档,错误码就会被保存在errno变量中,然后用strerror函数进行解析错误码,最后用printf函数打印错误信息,所以说以后运用的时候就可以这样用了。

(三)perror

有个perror库函数,更加强大,在报错领域中自行打印,我们先来看一下这个库函数的介绍:
在这里插入图片描述
如下代码,我们将printf换成perror库函数,因为perror是直接打印错误信息,在打印错误信息前,会先打印自定义的信息,也就是说,perror相当于printf+strerror:

#include<stdio.h>
int main() {
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL) {
		//printf("%s\n",strerror(errno));
		perror("fopen");
		return 1;
	}
	//读文件
	//关闭文件
	fclose(pf);//释放
	pf = NULL;

	return 0;
}

对于以上代码,perror(“error”)是perror函数的写法,所以perror会输出:传参信息+冒号+错误信息。


十一字符分类函数(头文件:<ctype.h>)

在这里插入图片描述
我们举个大小写的例子吧,先来看一下islower字符分类函数的简单介绍:
在这里插入图片描述

那我们试一试吧!

在这里插入图片描述


十二、字符转换

int tolower ( int c );大写字母转小写
int toupper ( int c );小写字母转大写

如下代码:

#include<stdio.h>
#include <ctype.h>
int main(){
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i]){
		c = str[i];
		if (isupper(c))
			c = tolower(c);
		putchar(c);
		i++;
	}
	return 0;
}

总结

这十二个是字符串函数和字符分类函数的汇总,但真正的汇总可远不止这些,当然,库里面还有很多其他的奇特的库函数和有用的库函数在这里都没有表示出来,这里只是展现了我们常用的几个库函数,所以我们在以后的学习中多多运用互联网去搜寻这些库函数并进行学习,当我们有一天变的很强大,都掌握了的时候,那就是真正学会了一门语言。


客官,码字不易,来个三连支持一下吧!!!关注我不迷路!!!

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

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

相关文章

Linux操作系统-信号

信号的基本认识&#xff1a;Linux信号机制&#xff1a;它是一种异步的通知机制&#xff0c;用来提醒进程一个事件已经发生。如上图&#xff0c;Linux操作系统中&#xff0c;共有编号为1~31的31个普通信号&#xff0c;编号为34~64的31个实时信号。日常中只会涉及和使用到普通信号…

说说你对Spring三级缓存的理解

这个问题或者换个问法&#xff1a;Spring是如何解决循环依赖的&#xff1f;答案即是Spring的三级缓存 什么是循环依赖&#xff1f; 简单说&#xff0c;就是A对象依赖B对象&#xff0c;B对象⼜依赖A对象&#xff0c;类似的代码如下&#xff1a; 其他还有很多种⽅式&#xff0…

内核解读之内存管理(12)进程虚拟内存管理 vm_area_struct 与反向映射

在32位的系统上&#xff0c;线性地址空间可达到4GB&#xff0c;这4GB一般按照3:1的比例进行分配&#xff0c;也就是说用户进程享有前3GB线性地址空间&#xff0c;而内核独享最后1GB线性地址空间。由于虚拟内存的引入&#xff0c;每个进程都可拥有3GB的虚拟内存&#xff0c;并且…

靶机测试ReconForce笔记

靶机地址https://www.vulnhub.com/entry/hacknos-reconforce,416/靶机测试信息收集nmap扫描端口nmap扫描结果└─$ nmap -sC -sV 192.168.1.100 -oA hack …

结合NWR,让Paxos拥有的动态的Quorum,以及在Klein中的实践

Paxos Quorum面临的困境在原生的Basic-Paxos或者Multi-Paxos中&#xff0c;Quorum的数量要求的是多数派&#xff0c;例如&#xff1a;一个5成员组成的Paxos集群&#xff0c;Prepare和Accept阶段需要获得3个Acceptor的支持。Quorum3的条件&#xff0c;在原生的Paxos中是硬性条件…

NTP服务器(GPS北斗授时服务器)的市场需求及性能分析

NTP服务器&#xff08;GPS北斗授时服务器&#xff09;的市场需求及性能分析 NTP服务器&#xff08;GPS北斗授时服务器&#xff09;的市场需求及性能分析 目前国内NTP时间服务器时间精度已达到毫秒级&#xff0c;能够满足各个行业对时间同步运转的要求&#xff1b;有些企业需要…

QtitanComponents Solution 2022.4.0 Crack

2022-12-29 开始开发基于Adobe XD文件的Qt样式创建工具 包括&#xff1a; QtitanDataGrid QtitanRibbon QtitanNavigationDesignUI QtitanChart QtitanDocking QtitanFastInfoset 不要问我源码&#xff0c;没有&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#x…

Spring Boot 加载外部配置文件

Spring Boot 允许你从外部加载配置&#xff0c;这样的话&#xff0c;就可以在不同的环境中使用相同的代码。支持的外部配置源包括&#xff1a;Java属性文件、YAML文件、环境变量、命令行参数。用Value注解可以将属性值直接注入到beans中。命令行参数以 -- 开头配置文件加载的顺…

数据结构学习

数据结构 单值二叉树 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 类似上述图中&#xff0c;所有结点都为1&#xff0c;那么返回true&#xff0c;只要有一个结…

QT智能停车管理系统

智能停车管理系统 密级Confidentiality level 需求说明书 内部公开 产品版本Product version Total pages 共 7页 V100R001 智能停车管理系统项目 需求规格说明书 拟制人&#xff1a; 孙献 时间&#xff1a; 2023.1.7 评审人&#xff1a; 覃丽红 时间&#xff1a;…

Java项目:网上水果超市商城设计和实现(java+SSM+springboot+redis)

源码获取&#xff1a;本博客首页 "资源" 处下载&#xff01; 主要技术实现&#xff1a;spring、 springmvc、 redis、 springboot、 mybatis 、session、 jquery 、 md5 、bootstarp.js tomcat、、拦截器等。 主要功能实现&#xff1a; 前端&#xff1a;登录、注册…

Instagram 账号被封如何申诉拿回账号?ins账号解封经验分享

不知道各位在玩转海外社媒平台时有没有遇到过Instagram账号异常的情况&#xff0c;比如会出现账号受限、帖子发不出去、账号被封号等情况? Instagram账号如果被封不用马上弃用&#xff0c;我们可以先尝试一下申诉&#xff0c;看看能不能把账号解封。所以今天东哥将会出一篇Ins…

94、【树与二叉树】leetcode ——110. 平衡二叉树(C++版本)

题目描述 原题链接&#xff1a;110. 平衡二叉树 解题思路 一、后序遍历&#xff08;自底向上&#xff09; 在这里要和 90、【树与二叉树】leetcode ——104. 二叉树的最大深度&#xff1a;层次遍历DFS子问题分解&#xff08;C版本&#xff09; 这个作比较。 深度&#xff0…

黑马前端毕业生面试攻略

为不断提升学生就业质量&#xff0c;黑马上海校区率先实施“新就业模式”&#xff0c;采用精细化管理&#xff0c;将就业动作拆解到了课程周期内的各个阶段&#xff0c;提前制定和铺垫课程阶段对应的就业动作目标和重点&#xff0c;并严格落实把控&#xff0c;更高效地完成学生…

JavaScript Event对象

文章目录JavaScript Event对象概述Event对象属性方法event对象常用属性typekeyCode获取Event对象兼容代码获取事件的目标对象target属性和currentTarget属性JavaScript Event对象 概述 事件在浏览器中是以Event对象的形式存在的&#xff0c;每触发一个事件&#xff0c;就会产…

【魅力开源】第2集:三个人每人一个想法会发生什么故事?关于Odoo的江湖

文章目录一. 关于权限控制&#xff1a;组织、角色、人员权限的说明二. 关于快速批量功能&#xff1a;有一些事情可以交给电脑来做三. 关于可以拖拉拽应用&#xff1a;技术模块3.1 可配置的MVC3.2 简单开发下附件模块也可用来作为企业的知识沉淀3.3 多语言支持&#xff1a;对于跨…

第五届“泰迪杯”数据分析技能赛 经验代码分享

第五届“泰迪杯”数据分析技能赛 经验/代码分享 品牌&#xff1a;“泰迪杯”数据分析技能赛 组织单位&#xff1a;泰迪杯数据分析技能赛组织委员会、广东泰迪智能科技股份有限公司、广东省工业与应用数学学会、人民邮电出版社、北京泰迪云智信息技术研究院、网宿科技股份有限…

内存管理详解

目录 一、C/C中内存分布 二、C语言的内存管理方式 三、C的内存管理方式 3.1 new/delete操作内置类型 3.2 new/delete操作自定义类型 3.3 operator new()和operator delete()函数 3.4 重载operator new()和operator delete() 四、new、delete的实现原理 4.1 内置类型 …

(02)Cartographer源码无死角解析-(50) 2D点云扫描匹配→相关性暴力匹配2:RealTimeCorrelativeScanMatcher2D

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

【论文速递】TPAMI2022 - 小样本分割的整体原型激活

【论文速递】TPAMI2022 - 小样本分割的整体原型激活 【论文原文】&#xff1a;Holistic Prototype Activation for Few-Shot Segmentation 获取地址&#xff1a;https://ieeexplore.ieee.org/document/9839487 CSDN下载&#xff1a;https://download.csdn.net/download/qq_36…