HR看好的字符函数和字符串处理函数!!!

news2025/4/17 5:58:40
  • 本篇会加入个人的所谓‘鱼式疯言’
  • ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的,可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念
    在这里插入图片描述

前言

在本篇文章中小编主要讲解以下内容
💕1.字符分类函数和字符转化函数
2. strlen 函数
3. strcpy 函数和 strncpy 函数
4. strcat 函数和 strncat 函数
5.strcmp 和 strncmp 函数
6. strstr 函数
7. strtok 函数💕
是不是感觉像高中背英语单词一样,怎么那么多哇,没关系,接下来让小编一一介绍,让大家能够在理解的基础上进行记忆。
💖💖💖下面,开始吧!!!

一.字符分类函数和字符转化函数

1.字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的?
这下我们就需要用到字符分类函数:
在这里插入图片描述
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
下面小编就举例一部分相关函数给友友们示范一下
//各种字符函数_test

#include<stdio.h>
#include<ctype.h>
int main()
{
	char ar = getchar();
	printf("%d\n",isalnum(ar));
	if (isalnum(ar))
	//判断成立,返回非零,否则为0.
	{
		printf("小写字母,大写字母,或数字\n");
	}
	if (islower(ar))
	{
		printf("小写字母\n");
	}
	else if (isupper(ar))
	{
		printf("大写字母\n");
	}
	else if (isdigit(ar))
	{
		printf("数字\n");
	}
	else if (isspace(ar))
	{
		printf("各种换行,空格,制表符\n");
	}
	else if (ispunct(ar))
	{
		printf("标点\n");
	}
	else
	{
		printf("啥都不是\n");
	}
	return 0;
}

在这里插入图片描述
通过上面示范我们看到了字符分类函数的使用很简单
只需要把字符或字符变量放在函数的参数部分
如果该字符满足判断条件就返回非0,否则就返回0.

2.字符转化函数

//大小写转化_test
#include<stdio.h>
#include<ctype.h>
int main()
{
	
	char a[20] = "HeLLo MYstrl";
	char* p=a;
	while (*p)
	{
		if (isupper(*p))
		{
			*p=tolower(*p);
		}
		putchar(*p);
		p++;
	}
	return 0;
}

在这里插入图片描述
字符串转化函数的要义:
以大写字母转小写字母为例,我们可以看到,当字母为小写时,我们无须转化,当字母为大写时就会自动转化

鱼式疯言

这里要注意字符转化函数是有返回值的,所以当我们要用时,我们用的函数的返回值。

二.strlen函数

1. strlen 函数基本形式

size_t strlen ( const char * str )

返回类型:size_t <=> unsigned(无符号整型)
参数:const 修饰的字符类型指针

2.使用范例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abcde";
	printf("%zd", strlen(arr1));
	//返回类型是size_t,要用%zd打印
	return 0;
}

在这里插入图片描述

3.错误示范

#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

在这里插入图片描述
看到这里的小伙伴是不是很费解啊,是不是想连发连发3个 why
😲😲😲why why why???
有没有小伙伴想到呢?
怎么都不说,都那么低调么?
不说的话,那只能小编来说啦!💖💖💖
先说说函数实现原理和细节吧

• 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含
‘\0’ )。
• 参数指向的字符串必须要以 ‘\0’ 结束。
• 注意函数的返回值为size_t,是⽆符号的 ( 易错 )
strlen 的使⽤需要包含头⽂件

所以聪明的你
也就知道小编的要说的是哪一点了
没错,我们要注意他的返回类型是size_t是无符号整型
两个无符号整型相减必然还是无符号整型,所以就一定不可以出现负数哦!
那怎么比较呢,请往下 look

#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if ((int)strlen(str2) - (int)strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

在这里插入图片描述
我们只需要强制转化成 有符号整型 int 就可以比较啦😁

这里是不是还想到还有一种类型自动转化的含义呢?
什么意思呢?就是说现在是两个无符号整型是这样子,如果一边是 无符号 一边是 有符号 那是怎么样的呢?

#include<stdio.h>
#include<string.h>
int main()
{
	
	if (strlen("abc")>-1)
	{
		printf("该字符串个数>-1\n");
	}
	else
	{
		printf("该字符串个数<=-1");
	}
	return 0;
}

在这里插入图片描述

鱼式疯言

我们就可以得出结论啦,不等号左边是无符号整型,而不等号右边是有符号整型。
当两者相遇时,都会转化为无符号整型,而-1的无符号整数是一个很大的数(记住就好的),就会出现上面这种结果。

4.模拟strlen函数实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
//模拟strlen函数的三钟方法
int my_strlen1(const char* st)
//方法一:指针加减常数法
//用const 锁定 st的数据
//我们只传参,不改变
{
	int count = 0;
	assert(st);
	//判断st是否是NULL,再执行.
	while (*st)
	{
		count++;
		st++;
	}
	return count;
}
int my_strlen2(const char* st)
//方法二:指针减指针法
{
	const char* begin = st;
	assert(st && begin);
	while (*st)
	{
		st++;
	}
	return (int)(st - begin);
}
//方法三:用函数递归实现不创建临时变量计算字符串长度.
int my_strlen3( char* str)
{
	if (*str=='\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen3(++str);
		//此处用++str或 str+1,不可用str++,为什么呢?
		//因为我们要明白的是当str进入时就要递归地址就要向右走
		//str++还是用的是str.
	}
}
int main()
{
	char arr1[] = "abcdef";
	//int sz=my_strlen1(arr1);
	//int sz=my_strlen2(arr1);
	int sz=my_strlen3(arr1);
	printf("%d", sz);
	return 0;
}

在这里插入图片描述

这里小编提供了三种方法来实现我们的 strlen 函数,有兴趣的小伙伴可以尝试跟着小编的方法来模拟一下哦💕💕💕

三.strcpy函数和strncpy函数

1.styrcpy函数基本形式

char* strcpy(char * destination, const char * source )
返回类型:char* 指针类型
参数:char* 指针的目标字符,char* 指针的源字符。

2.strcpy使用范例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[30] = "abcde";
	char arr2[] = "my_boy";
	printf("%s", strcpy(arr1, arr2));
	return 0;
}

在这里插入图片描述
小小的说明一下,想必友子们都看到了,strcpy 的作用就是把 arr1 的字符串完完整整的拷贝到arr2 中,而在这里能直接打印的原因是因为 strcpy 返回到 arr1 的首元素的地址。

3.strcpy的模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
char* my_strcpy1(char* ar1, const char* ar2)
//普通版本_传字符同时向右走
{
	assert(ar1 && ar2);
	char* retn = ar1;
	while (*ar2)
	{
		*ar1 = *ar2;
		ar1++;
		ar2++;
	}
	//跳出时还要把\0赋上去.
	*ar1 = *ar2;
	return retn;
}
char* my_strcpy2(char* ar1, const char* ar2)
//高端版本_test
{
	char* retn=ar1;
	while ( *ar1++ = *ar2++)
	//ar2先赋值后++,arr1在得到值++.
	//当我们ar2到达\0时,我们就可先赋值再判断.
	{
		;
	}
	return retn;
}
int main()
{
	char arr1[30] = "abcde";
	char arr2[] = "my_boy";
	printf("%s", my_strcpy2(arr1, arr2));
	return 0;
}

在这里插入图片描述

鱼式疯言

当我们需要打印字符串时,我们只需要知道字符串的首个字符的地址,就可以用 %s 输出整个字符串啦!!!😊😊😊

4.strncpy使用范例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "**************";
	char arr2[] = "hello bit";
	printf("%s\n", strncpy(arr1, arr2, 3));
	printf("%s\n", strncpy(arr1, arr2, 5));
	printf("%s\n", strncpy(arr1, arr2, 10));
	printf("%s\n", strncpy(arr1, arr2, 12));
	//这里充分证明了用strncpy是代入\0的.
	return 0;
}

在这里插入图片描述

5.模拟strncpy实现

#define _CRT_SECURE_NO_WARNINGS
//strncpy_test
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "**************";
	char arr2[] = "hello bit";
	printf("%s\n", strncpy(arr1, arr2, 3));
	printf("%s\n", strncpy(arr1, arr2, 5));
	printf("%s\n", strncpy(arr1, arr2, 10));
	printf("%s\n", strncpy(arr1, arr2, 12));
	//这里充分证明了用strncpy是不代入\0的.
	return 0;
}

在这里插入图片描述

这里的strncpy和strcpy的唯一区别就是能够在arr1内部指定拷贝多少字符
达到便利的效果。
能保证拷贝字符的安全性,不至于因为arr2字符长度过大导致非法访问。
什么???
居然有宝子问,什么是非法访问,请不懂宝子们移步我们下面的鱼式疯言了解了解。

鱼式疯言

非法访问:
当一个数组长度已经确定好了,如果超出这个数组长度去访问,我们就会形成非法访问
😵😵😵简而言之就是占别人的地盘了!!!

四.strcat函数和strncat函数

1.strcat函数基本形式

char strcat(char dest, const charsrc)
返回类型: char
指针类型
参数:char* 类型目标字符和 const 修饰的 char* 类型的源字符。

2.strcat使用范例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1 [10] = "abcde";
	char arr2 [10] = "fegh";
	//先覆盖arr1的\0,再用arr2追加。
	printf("%s", strcat(arr1, arr2));
	return 0;
}

在这里插入图片描述
诸位仁兄都看到了吧!!!
这个strcat函数主要是把arr2的字符追加arr1后面,从而达到补字符串的效果。

3.strcat模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
//模拟实现strcat函数的拉长
char* my_strcat(char* atr1,const char*atr2)
//atr1为目标字符串。此处不需要加const锁定。
{
	assert(atr1 && atr2);
	char* p = atr1;
	while (*atr1)
	{
		atr1++;
	}
	//先让目标字符串到达\0.
	while (*atr1++=*atr2++)
	{
		;
		//最好这里用空语句.代表这里不需要加语句
	}
 //再赋值即可
	return p;
}
int main()
{
	char arr1[40] = "hello ";
	char arr2[] = "bit";
	printf("%s", my_strcat(arr1, arr2));
	return 0;
}

在这里插入图片描述

4.strncat范例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1 [10] = "abcde**";
	char arr2 [10] = "fegh";
	//先覆盖arr1的\0,再用arr2中选定的部分字符追加。
	//并带上\0.
	printf("%s", strncat(arr1, arr2,2));
	return 0;
}

在这里插入图片描述
• 源字符串必须以 ‘\0’ 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。

5.模拟strncat实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
//模拟实现strncat字符追加
char* my_strncat(char* p1, const char* p2, int count)
{
assert(p1 && p2);
char* stu = p1;
while (p1)
{
p1++;
}
//注意这里跳到\0后的\0就打印不出来啦.
while (count–)
{
p1 = p2;
p1++;
p2++;
}
return stu;
}
int main()
{
char arr1[15] = “abcdef”;
char arr2[10] = "
“;
printf(”%s", my_strncat(arr1, arr2, 7));
return 0;
}
在这里插入图片描述

鱼式疯言

追加后面是一定要带 **\0** 的
不然我们是无法打印出正确的追加后的字符的

五. strcmp 和 strncmp 函数

1. strcmp 的基本形式

int my_strcmp (const char * str1, const char * str2)
返回类型: int
参数:两个都是 const 修饰的 char* 的指针

2. strcmp 范例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[40] = "abcdefghi";
	char arr2[40] = "abcdeu";
	if (strcmp(arr1, arr2) == 1)
	{
		printf("arr1>arr2");
	}
	else if(strcmp(arr1, arr2) == 0)
	{
		printf("arr1=arr2");
	}
	else
	{
		printf("arr1<arr2");
	}
	return 0;
}

在这里插入图片描述

  • 第⼀个字符串⼤于第⼆个字符串,则返回 ⼤于0 的数字
  • 第⼀个字符串等于第⼆个字符串,则返回 0
  • 第⼀个字符串⼩于第⼆个字符串,则返回 ⼩于0 的数字

那么如何判断两个字符串?

⽐较两个字符串中对应位置上字符 ASCII码值 的⼤⼩。
注意这里一定是对应位置哦,以上面的代码为例, arr1 的 a 和 arr2 的 a 进行对比,然后一直对应比下去,直到 arr1 的f的 ASCII 值比 arr2 的 ASCII 小,得出 arr1 比 arr2 小,返回 -1

3. strcmp 的模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
// 模拟实现一个strcmp_test
int my_strcmp(const char*p1,const char*p2)
{
	assert(p1 && p2);
	while (*p1 == *p2)
	//先循环判断
	{
		p1++;
		p2++;
		if (*p1 > *p2)
		{
			return 1;
		}
		//一定要在循环内,一旦判断成立就会跳出函数.
		if (*p1 == '\0')
		{
			return 0;
		}
		if (*p1 < *p2)
		{
			return -1;
		}
	}
	
}
int main()
{
	char arr1[30] = "abrbcd";
	char arr2[30] = "abbcd";
	int sz=my_strcmp(arr1, arr2);
	if (sz>0)
	{
		printf("大于\n");
	}
	else if (sz < 0)
	{
		printf("小于\n");
	}
	else
	{
		printf("等于\n");
	}
	return 0;
}

在这里插入图片描述
有兴趣的宝子们可以康康哦😊😊😊

4. strncmp 示范

 #include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abceg";
	char arr2[20] = "abcfg";
	if (strncmp(arr1, arr2,3) == 1)
	{
		printf("arr1>arr2\n");
	}
	else if (strncmp(arr1, arr2,3) == 0)
	{
		printf("arr1=arr2\n");
	}
	else
	{
		printf("arr1<arr2\n");
	}
	if (strncmp(arr1, arr2, 5) == 1)
	{
		printf("arr1>arr2\n");
	}
	else if (strncmp(arr1, arr2, 5) == 0)
	{
		printf("arr1=arr2\n");
	}
	else
	{
		printf("arr1<arr2\n");
	}
	return 0;
}

在这里插入图片描述
strcmp是全体比较,那么strncmp就选择性比较,比较的原理还是一样的哦.😊😊😊
在这里小编就不带着大家实现咯,和上面实现的原理差不多哦。

六. strstr 函数

1.strstr 函数的基本形式

char * strstr ( const char * str1, const char * str2);
返回类型: char*
函数返回字符串 str2 在字符串 str1 中第⼀次出现的位置
参数:两个都是 const 修饰的 char* 的指针

2. strstr 的范例

//strstr_test
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[40] = "abcdef";
	char arr2[40] = "cd";
	printf("%s", strstr(arr1, arr2));
}

在这里插入图片描述

3.模拟 strstr 的实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
//模拟实现 my_strstr 的实现
char* my_strstr(const char* str1, const char* str2)
{
	char* p1 = (char*)str1;
	char* p2 = (char*)str2;
	//这里是需要两个参数和两个临时变量的
	//一个记住起始位置,一个进行移动判断是否相等
	assert(str1);
	if (str2 == '\0')
	{
		return (char*)str1;
	}
	while (*str1)
		//这里是目标字符遇到\0
		//就意味着我们我们目标字符就遍历完了
		//再也找不到了
	{
		p1 = (char*)str1;
		p2 = (char*)str2;
		while (*p1 == *p2)
		{
			p1++;
			p2++;
			if (*p2 == '\0')
				//只要源字符一遇到\0我们就意味着判断结束
				//找到了
			{
				return(char*) str1;
			}
		}
		str1++;
		//如果源字符再遇到\0之前,还未一直==,
		//目标字符也要跟着移动
	}
	return NULL;
	//str1跳出循环后,就会已NULL空指针的方式返回
}
int main()
{
	char arr1[40] = "abcccdef";
	char arr2[50] = "c";
	char* ch = my_strstr(arr1, arr2);
	if (ch == NULL)
	{
		printf("找不到了\n");
	}
	else
	{
		printf("%s", ch);
	}
}

在这里插入图片描述

如果有小伙伴没有看懂的话?💕💕💕
这里小编就在这里小小说明一下
我们 strstr 函数呢,主要是找子字符串 arr2 ,然后从找到子字符串开始一直往后输出 arr1.

七. strtok 函数

1. strtok 基本形式

char * strtok ( char * str, const char * sep);
返回类型: char* 指针类型
参数: char* 指针和 const 修饰的 char*
• sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
• 第⼀个参数指定⼀个字符串,它包含了 0个 或者多个由 sep字符串中⼀个 或者多个分隔符分割的标
记。
• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。

2.strtok 示例

#include<stdio.h>
#include<string.h>
//strtok_test
int main()
{
	char arr[] = "abcef@12345...zho11111";
	char* p = "@.";
	char*ps1=strtok(arr, p);
	printf("%s\n", ps1);
	char*ps2=strtok(NULL, p);
	printf("%s\n", ps2);
	char* ps3 = strtok(NULL, p);
	printf("%s\n", ps3);
	return 0;
}

在这里插入图片描述
因为这个函数自身比较复杂,实现起来很难让大家接受,所以感兴趣的小伙伴可以自己尝试尝试哦💖💖💖

鱼式疯言

简而言之,言而总之,就要这个strtok函数就是把分隔的各种标点分隔开,唯一使用的细节是先使用原指针arr,还有标点指针,然后在第一个参数一直传空指针就 OK 啦.以上小编介绍的这些字符串实现函数都有一个共同的头文件 string.h

总结

在本章内容我们主要讲解了

💕💕💕- 字符分类函数和字符转化函数

  • 各种字符串函数的功能并带着大家去实现
    有:
  1. strlen 函数来测量字符串长度的。
  2. strcpy 函数和 strncpy 函数来拷贝字符的。
  3. strcat 函数和 strncat 函数来追加字符的。
    5.strcmp 和 strncmp 函数比较字符大小的。
  4. strstr 函数寻找部分字符的。
  5. strtok 函数分段字符的。
    可谓是收获颇多…💖💖💖

💖💖💖本次博文就到这里了,感觉各位小伙伴的赏脸品读小编写的拙作哦,如果觉得小编写的还不错的咱可支持三关下,不妥当的咱评论区指正,希望我的文章能给各位家人们带来哪怕一点点的收获就是小编创作的最大动力💖💖💖
在这里插入图片描述

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

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

相关文章

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好&#xff0c;最近在搞论文所以在研究各种论文的思想&#xff0c;这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布&#xff0c;其主要的核心思想是&#xff1a;基于多层感知机&#xff08;MLP&#xff09;构建的编码器-解码器架构&#xff0c;核心创…

【设计模式-4.3】行为型——责任链模式

说明&#xff1a;本文介绍设计模式中行为型设计模式中的&#xff0c;责任链模式&#xff1b; 审批流程 责任链模式属于行为型设计模式&#xff0c;关注于对象的行为。责任链模式非常典型的案例&#xff0c;就是审批流程的实现。如一个报销单的审批流程&#xff0c;根据报销单…

44 - 几款常用的性能测试工具

熟练掌握一款性能测试工具&#xff0c;是我们必备的一项技能。他不仅可以帮助我们模拟测试场景&#xff08;包括并发、复杂的组合场景&#xff09;&#xff0c;还能将测试结果转化成数据或图形&#xff0c;帮助我们更直观地了解系统性能。 1、常用的性能测试工具 常用的性能测…

前端笔记(二):CSS 选择器与特性

CSS&#xff08;层叠样式表&#xff09;是一种样式表语言&#xff0c;用于描述HTML或XML文档的呈现方式。它定义了如何在屏幕、纸张或其他媒体上显示文档的样式、布局和外观。 里面的代码由 选择器 { } 组成 体验 CSS CSS 可以让我们界面变得更加美观&#xff0c;这是 CSS 的…

Kafka 架构深度解析:生产者(Producer)和消费者(Consumer)

Apache Kafka 作为分布式流处理平台&#xff0c;其架构中的生产者和消费者是核心组件&#xff0c;负责实现高效的消息生产和消费。本文将深入剖析 Kafka 架构中生产者和消费者的工作原理、核心概念以及高级功能。 Kafka 生产者&#xff08;Producer&#xff09; 1 发送消息到…

RPG项目01_脚本代码

基于“RPG项目01_场景及人物动画管理器”&#xff0c;我们创建一个XML文档 在资源文件夹下创建一个文件夹&#xff0c; 命名为Xml 将Xnl文档拖拽至文件夹中&#xff0c; 再在文件夹的Manager下新建脚本LoadManager 写代码&#xff1a; using System.Collections; using System…

基于CNN对彩色图像数据集CIFAR-10实现图像分类--keras框架实现

项目地址&#xff08;kaggle&#xff09;&#xff1a;基于CNN对彩色图像数据集CIFAR-10实现图像分类--keras | Kaggle 项目地址&#xff08;Colab&#xff09;&#xff1a;https://colab.research.google.com/drive/1gjzglPBfQKuhfyT3RlltCLUPgfccT_G9 导入依赖 在tensorflow…

若依的基本使用

演示使用网址:若依管理系统 网站:RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架|RuoYi开源|RuoYi视频|若依视频|RuoYi开发文档|若依开发文档|Java开源框架…

绝地求生在steam叫什么?

绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》&#xff0c;简称为PUBG。作为一款风靡全球的多人在线游戏&#xff0c;PUBG于2017年3月23日正式上线Steam平台&#xff0c;并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法&#xff0c;玩家将被投放到一个辽阔的荒…

基于 ESP32 的带触摸显示屏的 RFID 读取器

如何设计一款基于 ESP32 且具有 ILI9341 触摸屏显示屏且适合壁挂式安装的美观 RFID 读取器。 本项目中用到的东西 硬件组件 ESP32 开发套件 C 1 AZ-Touch ESP 套件 1 RFID-RC522 IC卡读写器 1 ​编辑 电线、绕包线 1 详细设计流程 …

结构体实现位段

一.什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或 signed int &#xff0c;在C99中位段成员的类型也可以 选择其他类型。 位段的成员名后边有⼀个冒号和⼀个数字 struct A {int a : 5;int b : 4;int c : 2…

SpringBoot的配置加载优先级

目录 一、背景分析 二、学习资源 三、具体使用 四、一些小技巧 方式一 方式二 一、背景分析 SpringBoot项目在打包之后&#xff0c;其配置文件就在jar包内&#xff0c;如果没有<配置文件优先级>这个机制&#xff0c;那么项目打成jar包之后&#xff0c;如果启动项目…

avue-crud中时间范围选择默认应该是0点却变成了12点

文章目录 一、问题二、解决三、最后 一、问题 在avue-crud中时间范围选择&#xff0c;正常默认应该是0点&#xff0c;但是不知道怎么的了&#xff0c;选完之后就是一直是12点。具体问题如下动图所示&#xff1a; <template><avue-crud :option"option" /&g…

数据结构入门————树(C语言/零基础/小白/新手+模拟实现+例题讲解)

目录 1. 树的概念及其结构 1.1 树的概念&#xff1a; 1.2 树的相关概念&#xff1a; 1.3 树的表示方法&#xff1a; ​编辑 1.4 树的应用&#xff1a; 2. 二叉树的概念及其结构 2.1 概念: 2.2 特点&#xff1a; 2.3 特殊二叉树&#xff1a; 2.4 二叉树的性质&#xf…

shell编程-awk命令详解(超详细)

文章目录 前言一、awk命令介绍1. awk命令简介2. awk命令的基本语法3. 常用的awk命令选项4. 常用的awk内置变量 二、awk命令示例用法1. 打印整行2. 打印特定字段3. 根据条件筛选行4. 自定义分隔符5. 从文件中读取awk脚本 总结 前言 awk命令是一种强大的文本处理工具&#xff0c…

Qt OpenCV 学习(一):环境搭建

对应版本 Qt 5.15.2OpenCV 3.4.9MinGW 8.1.0 32-bit 1. OpenCV 下载 确保安装 Qt 时勾选了 MinGW 编译器 本文使用 MinGW 编译好的 OpenCV 库&#xff0c;无需自行编译 确保下载的 MinGW 和上述安装 Qt 时勾选的 MinGW 编译器位数一致&#xff0c;此处均为 x86/32-bit下载地址…

LongAddr

目录 1. 引言 2. AtomicInteger的局限性 3. AtomicInteger与LongAdder 的性能差异 4.LongAdder 的结构 LongAddr架构 Striped64中重要的属性 Striped64中一些变量或者方法的定义 Cell类 5. 分散热点的原理 具体流程图 6. 在实际项目中的应用 7. 总结 1. 引言 在这一…

【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)

目录 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1 访问限定符4.2 封装 五、类的作用域六、类的实例化七、类的对象大小的计算7.1 类对象的存储方式猜测7.2 如何计算类对象的大小 八、类成员函数的this指针8.1 this指针的引出8.2 this指…

课题学习(十四)----三轴加速度计+三轴陀螺仪传感器-ICM20602

本篇博客对ICM20602芯片进行学习&#xff0c;目的是后续设计一个电路板&#xff0c;采集ICM20602的数据&#xff0c;通过这些数据对各种姿态解算的方法进行仿真学习。 一、 ICM20602介绍 1.1 初识芯片 3轴陀螺仪&#xff1a;可编程全刻度范围(FSR)为250 dps&#xff0c;500 d…

Proteus仿真--基于ADC0832设计的两路电压表

本文介绍基于ADC0832实现的双路电压表采集设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 采集芯片选用ADC0832&#xff0c;电压显示在LCD1602液晶显示屏上 仿真运行视频 Proteus仿真--基于ADC0832设计的两路电压表 附完整Proteus仿真资料代码资料…