真嘟假嘟?!这么清晰简单的字符函数和字符串函数!!!

news2025/3/3 20:57:57

目录​​​​​​​

1. 字符分类函数

1.1 小练习

1.1.1 方法一

2. 字符转换函数

2.1 小练习的方法二

3. strlen的使⽤和模拟实现

3.1 注意事项

3.1.1 注意事项2的练习

3.2 strlen函数的模拟实现

3.2.1 方法一

3.2.2 方法二(指针—指针)

3.2.3 方法三(递归方式)

3.2.3.1 注意事项

4. strcpy的使⽤和模拟实现

4.1 注意事项

4.2 使用举例

4.2.1 注意点!!!

4.3 stcpy函数的模拟实现

4.3.1 版本一(先拷贝\0之前的字符,再拷贝\0之后的字符)

4.3.2 版本二(拷贝\0前的字符包括\0)

4.3.3 版本三 (assert,防止死循环)

4.3.4 版本四 (dest指向的空间是需要改变的,但是src指向的空间是不被期望改变的)

4.3.5 版本五 (返回目标空间的起始地址)

5. strcat的使⽤和模拟实现

5.1 注意事项

5.2 使用举例

5.3 strcat函数的模拟实现

5.4 自己追加拼接自己可以吗?

6. strcmp的使⽤和模拟实现

6.1 使用举例

6.2 strcmp的模拟实现

7. strncpy函数的使⽤和模拟实现

7.1 使用举例

7.2 strncpy函数的模拟实现

8. strncat函数的使⽤和模拟实现

8.1 使用举例

8.2 strncat函数的模拟实现

9. strncmp函数的使⽤和模拟实现

9.1 使用举例

9.2 strncmp函数的模拟实现

10. strstr的使⽤和模拟实现

10.1 使用举例

10.2 strstr函数的模拟实现

10.2.1 模拟实现思路

10.2.2 模拟实现思路优化

10.2.3 代码实现

11. strtok函数的使⽤

11.1 用途介绍

11.2 使用举例

​编辑

11.2.1 方法优化

12. strerror函数的使⽤

12.1 使用举例

12.2 相关函数perror的使用


1. 字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。

这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

这可以让我们更加方便的判断⼀个字符是属于什么类型的字符的

接下来,我们以islower举例,其他函数使用的规则一样

int islower ( int c );

islower是用来返回参数是否是小写字母的,如果是小写字母就返回非零的值,如果不是小写字母就返回零

#include<stdio.h>
#include<ctype.h>
int main()
{
	int ret = islower('Q');
	printf("%d\n", ret);
	return 0;
}

1.1 小练习

接下来,让我们写一个代码,将字符串中的小写字母转大写,其他字符不变

1.1.1 方法一

思路:大小写字母相差32

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	char arr[] = "i AM A Student.";
	int i = 0;
	int len = strlen(arr);
	for (i = 0; i < len; i++)
	{
		if (islower(arr[i]))
		{
			arr[i] -= 32;
		}
	}
	printf("%s", arr);
	return 0;
}

但是,这种方法有点麻烦,让我们介绍完字符转换函数再来实现方法二

2. 字符转换函数

int tolower(int c);//将参数传进去的小写字母转大写

int toupper(int c);//将参数传进去的大写字母转小写

由此,我们可以得到方法二

2.1 小练习的方法二

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	char arr[] = "i AM A Student.";
	int i = 0;
	int len = strlen(arr);
	for (i = 0; i < len; i++)
	{
		if (islower(arr[i]))
		{
			arr[i]=toupper(arr[i]);
		}
	}
	printf("%s", arr);
	return 0;
}

3. strlen的使⽤和模拟实现

size_t strlen ( const char * str );

3.1 注意事项

注意事项:
1.strlen函数要正确获得字符串长度的话,字符串中必须要有\0
2.要注意strlen的返回值是size_t(字符串长度没有负数- - ->无符号整型)

3.1.1 注意事项2的练习

观察以下代码,判断输出符号:

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

可是,结果不是-3吗?为什么结果却是>呢?

返回类型觉得结果———>-3———>3
2个无符号类型相减得到的也是无符号整型

3.2 strlen函数的模拟实现

仿照strlen函数的参数,返回值,功能,写一个类似的函数

3.2.1 方法一

#include<stdio.h>
#include<ctype.h>
#include<string.h>
size_t my_strlen(char* str)
{
	int count = 0;//计数
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	size_t ret = my_strlen(arr);
	printf("%zd\n", ret);
	return 0;
}


3.2.2 方法二(指针—指针)

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	const char* p = str;
	assert(str != NULL);
	while (*str != '\0')
		str++;
	return str - p;
}
int main()
{
	char arr[] = "abcdef";
	size_t ret = my_strlen(arr);
	printf("%zd\n", ret);
	return 0;
}


3.2.3 方法三(递归方式)

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	if (*str == 0)
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	char arr[] = "abcdef";
	size_t ret = my_strlen(arr);
	printf("%zd\n", ret);
	return 0;
}

3.2.3.1 注意事项

可能会有人问str++可不可以?不行!!!

str++为什么不行?
后置++:先使用再++,str传址过去再++  ——>永远都传str的地址,str++或者++str导致str改变
str+1:str不变
但是,++str可以运行成功,但是str会改变,有隐患

4. strcpy的使⽤和模拟实现

char* strcpy(char * destination, const char * source );

4.1 注意事项

注意事项:
1.原字符串必须包含\0;同时\0也会被拷贝到目标空间
2.要保证目标空间要足够大,能放得下拷贝来的数据
3.还要保证目标空间可修改

4.2 使用举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
int main()
{
	char s1[] = "hello world";
	char s2[20] = "xxxxxxxxxxxxx";
	strcpy(s2, s1);
	printf("%s\n", s2);
	return 0;
}

按理来说,应该输出:hello worldxx

调试可以看到:拷贝的时候会将原字符串中的\0也拷进去,\0也拷贝过来后拷贝就结束了

4.2.1 注意点!!!

常量字符串---不可以修改

4.3 stcpy函数的模拟实现

4.3.1 版本一(先拷贝\0之前的字符,再拷贝\0之后的字符)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
void my_strcpy(char* dest, char* src)
{
	while (*src != 0)
	{
		*dest = *src;
		dest++;
		src++;
	}
	//拷贝\0
	*dest = *src;
}
int main()
{
	char s1[] = "hello world";
	char s2[20] = { 0 };
	my_strcpy(s2, s1);
	printf("%s\n", s2);
	return 0;
}


4.3.2 版本二(拷贝\0前的字符包括\0)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char*  my_strcpy(char* dest,  char* src)
{
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char s1[] = "hello world";
	char s2[20] = { 0 };
	printf("%s\n", my_strcpy(s2, s1));
	return 0;
}


4.3.3 版本三 (assert,防止死循环)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
char*  my_strcpy(char* dest,  char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char s1[] = "hello world";
	char s2[20] = { 0 };
	printf("%s\n", my_strcpy(s2, s1));
	return 0;
}


4.3.4 版本四 (dest指向的空间是需要改变的,但是src指向的空间是不被期望改变的)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
char*  my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char s1[] = "hello world";
	char s2[20] = { 0 };
	printf("%s\n", my_strcpy(s2, s1));
	return 0;
}


4.3.5 版本五 (返回目标空间的起始地址)

strcpy的功能是将原字符串的内容拷贝到目标空间,希望目标空间的内容发生改变
所以返回目标空间的起始地址,方便观察目标空间的内容

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
char*  my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char s1[] = "hello world";
	char s2[20] = { 0 };
	printf("%s\n", my_strcpy(s2, s1));
	return 0;
}

5. strcat的使⽤和模拟实现

char *my_strcat(char *dest, const char*src)

5.1 注意事项

注意事项:
1.从末尾追加拼接,末尾是\0,拼接结束末尾也是\0——>源头字符串要有\0(从哪里开始);目标空间中要有\0(到哪里结束)
2.目标空间要足够大,目标要可修改

5.2 使用举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
int main()
{
	char s[20] = "hello ";
	const char* p = "world";
	strcat(s, p);
	printf("%s\n", s);
	return 0;
}

5.3 strcat函数的模拟实现

模拟实现步骤:
1.找到目标空间\0
2.拷贝数据——strcpy函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char s[20] = "hello ";
	const char* p = "world";
	printf("%s\n", my_strcat(s, p));
	return 0;
}

5.4 自己追加拼接自己可以吗?

不可以❌

不行❌会自己把\0不断覆盖掉——>越界访问

6. strcmp的使⽤和模拟实现

比较2个字符串的大小

比较两个字符串中对应位置上的字符按照字典顺序比较

• 标准规定:

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

◦ 第⼀个字符串等于第⼆个字符串,则返回0

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

◦ 那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

6.1 使用举例

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<ctype.h>
int main()
{
	char s1[] = "abcdef";
	char s2[] = "abcq";
	int ret=strcmp(s1, s2);
	printf("%d\n", ret);
	return 0;
}

6.2 strcmp的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)//只是比较大小,不用修改值
{
	assert(str1 != NULL);//确保指针有效性
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')//只需要比较其中一个是否是\0,成立则都是\0
			return 0;
		str1++;
		str2++;
		if (*str1 > *str2)
			return 1;
		else
			return 1;
	}
}
int main()
{
	int ret = my_strcmp("abcdef", "abcdg");
	printf("%d\n", ret);
	return 0;
}

7. strncpy函数的使⽤和模拟实现

char * strncpy ( char * destination, const char * source, size_t num ); 

• 拷⻉num个字符从源字符串到⽬标空间。

• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个

7.1 使用举例

#include<stdio.h>
#include<ctype.h>
int main()
{
	char arr1[10] = "xxxxxxxxxx";
	char arr2[] = "ab";
	strncpy(arr1, arr2, 5);
	printf("%s\n", arr1);

	return 0;
}

我们可以通过调试看见,多余的位置用\0来凑​​​​​​​

7.2 strncpy函数的模拟实现

8. strncat函数的使⽤和模拟实现

8.1 使用举例

提供参数大于传输全部个数,则全部传输,并且无论长短传输\0不变

#include<stdio.h>
#include<ctype.h>
int main()
{
	char s1[20] = "abc\0xxxxxxxx";
	char s2[] = "def";
	strncat(s1, s2,5);
	printf("%s\n", s1);
	return 0;
}

8.2 strncat函数的模拟实现

9. strncmp函数的使⽤和模拟实现

int strncmp ( const char * str1, const char * str2, size_t num );

9.1 使用举例

#include<stdio.h>
#include<ctype.h>
int main()
{
	char s1[15] = "abcdef";
	char s2[] = "abcg";
	int ret = strncmp(s1, s2, 3);
	printf("%d\n", ret);
	return 0;
}

​​​​​​​

9.2 strncmp函数的模拟实现

10. strstr的使⽤和模拟实现

char * strstr ( const char *, const char * );

strstr函数的功能:

在字符串中找一个字符串

返回str2在str1中第一次出现的位置;如果str2在str1中没有出现,就返回NULL

10.1 使用举例

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	char s1[] = "abcdefabcdef";
	char s2[] = "efabc";
	char* ret = strstr(s1, s2);
	if (ret != 0)
		printf("找到了,是%s\n", ret);
	else
		printf("找不到\n");

	return 0;
}

10.2 strstr函数的模拟实现

10.2.1 模拟实现思路

首先,我们会想到遍历,当我们成功找到字符串时,却发现没有记住匹配成功的首个字符位置,无法返回首元素的地址,而且这只是最简单一种情况,我们直接就找到了

10.2.2 模拟实现思路优化

我们要考虑到多次查找和首元素的地址确定

10.2.3 代码实现

11. strtok函数的使⽤

char * strtok ( char * str, const char * sep);

11.1 用途介绍


解析:

• sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合

• 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记//第一个参数指向的字符串是由sep指向的第二个参数指向的字符串分割的

• strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)//将分割符变成\0,并返回标记的起始地址,打印的时候到\0停止

• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置//记住\0的位置

• strtok函数的第⼀个参数 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记

• 如果字符串中不存在更多的标记,则返回 NULL 指针

11.2 使用举例

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	char s[] = "iCiWVorwbnvvj@163.com";//字符串
	char* p = "@.";//分隔符
	char *ret = strtok(s, p);
	printf("%s\n", ret);
	return 0;
}

11.2.1 方法优化

如果分割符过多的话,则上面的方法过于冗长,需要我们一次次的运行,那我们可以将字符串拷贝到目标空间,再目标空间里进行循环输出,并且不改变源空间的字符串

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	char s[] = "iCiWVorwbnvvj@163.com.yuHjC.ieia";//字符串
	char* p = "@.";//分隔符
	char buf[100] = { 0 };
	strcpy(buf, s);
	char* r = NULL;
	for (r = strtok(s, p); r != NULL; r = strtok(NULL, p))
	{
		printf("%s\n", r);
	}
	return 0;
}

12. strerror函数的使⽤

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

在 C语言的库函数中设计了一些错误码,当我们库函数在调用的过程中发生的各种错误,要记录下来,这时候记录的就是错误码
例如:404———>该网页不存在

12.1 使用举例

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		char* ret = strerror(i);
		printf("%d:%s\n", i, ret);
	}
	return 0;
}

但是,我们怎么知道代码运行失败的原因是什么呢?

我们可以举个例子,来看看库函数在C语言中的作用,也可以看看错误的原因是什么

当库函数调用失败的时候,会将错误码记录到errno这个变量中

errno是C语言的一个全局变量

例如,我们要读取一个文件,读取文件前,我们要打开文件,打开成功,前提是文件存在,反之,则打开失败

我们看一下界面:

我想读区test_9_7这个文件,看看我们能不能成功

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test_9_7", "r");
	if (pf == NULL)
	{
		printf("打开文件失败,失败的原因是:%s\n", strerror(errno));
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
	}
	return 0;
}

虽然我们看到了错误原因,但是为什么打开失败呢?明明我的界面上就有这个文件啊!

那是因为,我们没有显示文件拓展名

通过拓展名,我们发现原来我们输入的文件名不对

这样之后,就可以打开成功了

12.2 相关函数perror的使用

perror函数是打印错误信息的

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
 perror("Error opening file unexist.ent");
 return 0;
}

本次的分享到这里就结束了!!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞👍+收藏⭐️+关注➕

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

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

相关文章

Unreal Engine Loop 流程

引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中&#xff0c;做了一个图。记录一下&#xff01;&#xff01; ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录&#xff0c;以备后用…

C++ 中 API 兼容与 ABI 兼容万字详解

文章目录 API 的生命周期兼容性级别向后兼容性向前兼容性功能兼容性源代码兼容性二进制兼容性 究竟是什么导致了二进制不兼容二进制不兼容可能导致的现象怎样维护源代码兼容添加功能修改功能弃用声明&#xff08;向后兼容&#xff09;移除功能&#xff08;向后兼容&#xff09;…

【大数据之Kafka】十、Kafka消费者工作流程

1 Kafka消费方式 &#xff08;1&#xff09;pull&#xff08;拉&#xff09;模式&#xff1a;消费者从broker中主动拉取数据。&#xff08;Kafka中使用&#xff09; 不足&#xff1a;如果Kafka中没有数据&#xff0c;消费者可能会陷入循环&#xff0c;一直返回空数据。 &#…

【性能测试】数据库优化

数据库优化 1. Oracle 1&#xff09;查询和修改数据库最大连接数 查看当前的数据库连接数: select count(*) from v$process; 数据库允许的最大连接数: select value from v$parameter where name processes; 修改数据库最大连接数: ----设置数据库最大连接数为2000 alte…

CSP 202305-2 垦田计划

直接用循环找最长天数的寻常写法只能拿15分&#xff0c;便运行超时结束了 #include <iostream> using namespace std; int main(){int n,m,k,t0;cin>>n>>m>>k;auto*datanew pair<int ,int>[n];for(int i0;i<n;i){cin>>data[i].first&g…

43.MQ—RabbitMQ

目录 一、MQ—RabbitMQ。 &#xff08;1&#xff09;同步调用与异步调用。 &#xff08;1.1&#xff09;同步调用。 &#xff08;1.2&#xff09;异步调用。 &#xff08;2&#xff09;MQ之间的区别。 &#xff08;3&#xff09;RabbitMQ学习。 &#xff08;3.1&#xf…

如何多号定时发朋友圈?

如何多号定时发圈&#xff1f; 通过定时发表朋友圈可以节省时间&#xff0c;保持账号信息更新的频率&#xff0c;在不同的适当时间进行宣传&#xff0c;让发布内容更精准的抵达目标客户&#xff0c;提高互动效果和阅读率&#xff0c;还可以防止朋友圈被折叠。 下面来看看是如何…

statistic learning outlook

supervised learning 贝叶斯估计 决策树与信息熵 信息熵 H ( D ) − ∑ i 1 n p ( X x i ) l o g ( P ( X x i ) ) − ∑ p i l o g ( p i ) H(D)-\sum_{i1}^n p(Xx_i)log(P(Xx_i))-\sum p_ilog(p_i) H(D)−∑i1n​p(Xxi​)log(P(Xxi​))−∑pi​log(pi​)&#xff0c;信…

帮助中心管理系统,人人都能用的知识管理平台

帮助中心管理系统是一种知识管理平台&#xff0c;旨在帮助企业有效组织和管理知识资源&#xff0c;使其能够为客户和员工提供快速、准确的帮助和支持。 关于帮助中心管理系统的重要特点和优势&#xff1a; 知识库管理&#xff1a; 帮助中心管理系统允许企业将知识组织和分类…

Vue3+Ts+Vite项目(第十二篇)——echarts安装与使用,vue3项目echarts组件封装

概述 技术栈&#xff1a;Vue3 Ts Vite Echarts 简介&#xff1a; 图文详解&#xff0c;教你如何在Vue3项目中引入Echarts&#xff0c;封装Echarts组件&#xff0c;并实现常用Echarts图例 文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、话不多数&#xff0c;引入 …

Linux 内核 6.5 发布,首次支持 Wi-Fi 7 和 USB4

导读Linux 6.5 内核 已经推出&#xff0c;此次更新在 Linux 6.4 内核的基础上进行了进一步的开发&#xff0c;带来了值得注意的改变和新特性。 Linus Torvalds 表示&#xff0c;这是一次相对顺畅的发布&#xff1a; 上周并没有发生任何异常或惊人的事情&#xff0c;因此没有理…

大数据之yarn

Yarn概述 是一个资源调度平台&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MR相当于操作系统中运行的软件&#xff0c;比如QQ、微信。 基础架构 ResourceManager 处理客户端请求监控NodeManager启动或监控ApplicationMaster资源的分配与调度 NodeManager 管理单…

CSC关于进一步优化国家公派出国留学服务管理工作的通知

近日国家留学基金委&#xff08;CSC&#xff09;在其官网上发布了“关于进一步优化国家公派出国留学服务管理工作的通知”&#xff08;https://www.csc.edu.cn/chuguo/s/2676&#xff09;&#xff0c;知识人网小编原文转载如下。 为进一步优化国家公派出国留学人员有关服务管理…

【开箱即用】开发了一个基于环信IM聊天室的Vue3插件,从而快速实现仿直播间聊天窗功能

前言 由于看到有部分的需求为在页面层&#xff0c;快速的引入一个包&#xff0c;并且以简单的配置&#xff0c;就可以快速实现一个聊天窗口&#xff0c;因此尝试以 Vue3 插件的形式开发一个轻量的聊天窗口。 这次简单分享一下此插件的实现思路&#xff0c;以及实现过程&#xf…

Elasticsearch近实时架构

1 Elasticsearch 与 Lucene 的结构理解 一个Elasticsearch索引由一个或多个分片&#xff08;shards&#xff09;组成。这些分片可以是主分片&#xff08;primary shard&#xff09;或副本分片&#xff08;replica shard&#xff09;。每个分片都是一个独立的Lucene索引&#xf…

什么是Docker和Docker-Compose?

Docker的构成 Docker仓库&#xff1a;https://hub.docker.com Docker自身组件 Docker Client&#xff1a;Docker的客户端 Docker Server&#xff1a;Docker daemon的主要组成部分&#xff0c;接受用户通过Docker Client发出的请求&#xff0c;并按照相应的路由规则实现路由分发…

Shell命令切换root用户、管理配置文件、检查硬件

Shell命令切换root用户、管理配置文件、检查硬件 切换root用户 两种方法 su命令详细介绍 sudo命令详细介绍 /etc/passwd文件 /etc/passwd文件里为什么有乱七八糟的用户&#xff1f; /etc/shadow文件 管理配置文件 检查硬件命令 查看CPU 查看GPU 与其他基于UNIX的系统…

【Java基础篇 | 面向对象】—— 继承

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 继承允许一个类继承另一个…

buuctf crypto 【[HDCTF2019]basic rsa】解题记录

1.打开文件 2.套用脚本 import random from binascii import a2b_hex,b2a_hex p 262248800182277040650192055439906580479 q 262854994239322828547925595487519915551 n p * q def multiplicative_inversr(a,b): x 0 y 1 lx 1 ly 0 oa a ob…

Python项目开发:Flask基于Python的天气数据可视化平台

目录 步骤一&#xff1a;数据获取 步骤二&#xff1a;设置Flask应用程序 步骤三&#xff1a;处理用户输入和数据可视化 步骤四&#xff1a;渲染HTML模板 总结 在这个数字化时代&#xff0c;数据可视化已经成为我们理解和解释信息的重要手段。在这个项目中&#xff0c;我们…