C语言——详解字符函数和字符串函数(一)

在这里插入图片描述

Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~
具体讲的内容如下:
在这里插入图片描述

在这里插入图片描述

文章目录

  • 🎆1.字符分类函数💯💯
    • ⏩1.1 什么是字符分类函数的?💯💯
    • ⏩1.2 字符函数的类型有哪些?💯💯
    • ⏩1.3 字符函数`islower`介绍及模拟实现💯💯
      • ⏩1.3.1`islower`函数具体介绍💯💯
      • ⏩1.3.2`islower`函数代码实现及效果💯💯
    • ⏩1.4字符分类函数练习💯💯
  • 🎆2.字符转换函数💯💯
    • ⏩2.1代码实现💯💯
  • 🎆 3.strlen的使用和模拟实现💯💯
    • ⏩3.1strlen函数的使用💯💯
      • ⏩3.1.1 strlen函数相关练习💯💯
    • ⏩3.2 strlen函数三种模拟实现💯💯
      • ⏩3.2.1 创建临时变量count💯💯
      • ⏩ 3.2.2 指针-指针💯💯
      • ⏩ 3.2.3 递归法求字符串长度💯💯
  • 🎆4.strcpy的使用和模拟实现💯💯
    • ⏩4.1 strcpy的使用规则💯💯
    • ⏩4.2 strcpy函数的基本使用💯💯
    • ⏩4.3 strcpy函数的模拟实现💯💯
      • ⏩4.3.1 strcpy函数的模拟实现方法1💯💯
  • 🎆5.strcat的使用和模拟实现💯💯
    • ⏩5.0.1 strcat函数简单介绍💯💯
      • ⏩5.0.1.1什么是strcat函数呢?函数原型是什么?💯💯
    • ⏩5.1 strcat的使用规则💯💯
    • ⏩5.2 strcat的使用和模拟实现💯💯
      • ⏩ 5.2.1strcat的使用💯💯
      • ⏩ 5.2.2 strcat的模拟实现💯💯

前言: 在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。

🎆1.字符分类函数💯💯

⏩1.1 什么是字符分类函数的?💯💯

众所周知,C语言中提供了一系列的字符函数,这些字符函数专门做字符分类的。
通俗点来讲: 这些函数就是判断这个字符是属于什么类型的字符的。
需要注意的是: 这些字符函数都需要包含头文件#include<ctype.h>

⏩1.2 字符函数的类型有哪些?💯💯

如下图所示:

在这里插入图片描述从图中,我们发现这些函数的使用方法其实非常类似,我们这里就讲一个字符函数islower吧,其他函数的实现方法也是跟这个比较类似~

⏩1.3 字符函数islower介绍及模拟实现💯💯

islower函数原型如下:

int islower(int c);

⏩1.3.1islower函数具体介绍💯💯

如下两图所示:
在这里插入图片描述
在这里插入图片描述
分析: 从这两幅图,我们可以看出islower是判断它的函数参数部分的c是否为小写字母的。
我们可以通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0

⏩1.3.2islower函数代码实现及效果💯💯

在这里插入图片描述
代码如下:

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

在这里插入图片描述
从动图中: 我们直观地看出如果islower函数的参数部分是小写字母,返回的是非0的数字。如果参数部分是大写字母或者其他类型的字符,则返回0

好,讲到这里,相信同学们就知道字符分类函数怎么用了,大家可以下去尝试一下,多实践~

⏩1.4字符分类函数练习💯💯

练习:

写一个代码,将字符串中的小写字母转大写,其他字符不变。

那这道题我们应该怎么思考呢?
我们来看下图:
在这里插入图片描述
我们来看下面的Ascll码值,可以看出大写字母'A''B'Ascll码值分别为65和66,小写字母'a''b'Ascll码值分别为97和98。
所以我们可以得出一个结论: 大写和小写的Ascll码值分别相差32
当我们知道这个结论,这题就很好做了,我们可以先创建一个字符数组,用islower函数遍历每一个字符,如果是小写字母,就让它的ASCLL码值-32即可。

当我们把题目分析成这样,代码自然可以顺理成章地写出来。

#include <stdio.h>
#include <ctype.h>
int main() {
	int i = 0;
	char str[] = "Test String.";
	while (str[i]) {
		if (islower(str[i])) {
			str[i] -= 32;
		}
		i++;
	}
	printf("%s\n", str);
	return 0;
}

这里我们要提醒一下:我们知道\0是字符串的结束标志,所以当while循环中的str[i]\0时,也就是为假,这是为什么呢?
如下图:
在这里插入图片描述
我么可以看出\0对应的ASCLL码值为0,那0为假,便跳出while循环,然后我们再来看printf部分,它这里是以%s的形式打印,那以%s本质上就是从那个地址开始,往后打印字符串,直到遇到\0为止。而这里的str恰好是数组名,我们之前就在这篇文章:C语言-指针讲解(2)讲过数组名是数组首元素的地址。所以这里本质上就是从arr首字符地址开始打印,直到遇到\0为止。

🎆2.字符转换函数💯💯

C语言提供了2个字符转换函数
它们的函数原型如下:

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

上面我们写的代码将小写字母转换为大写,是ASCLL码值-32完成的效果。但有了转换函数,就可以直接使用tolower函数。

⏩2.1代码实现💯💯

在这里插入图片描述

#include <stdio.h>
#include <ctype.h>
int main() {
	int i = 0;
	char str[] = "Test String.";
	while (str[i]) {
		if (islower(str[i])) //判断该字符是否为小写字母
		{
			str[i] = toupper(str[i]);//将对应字符的小写字母转换为大写字母
		}
		i++;
	}
	printf("%s\n",str);//从str的首元素地址开始打印字符串,直到遇到'\0'为止。
	return 0;
}

vs运行效果图:在这里插入图片描述

🎆 3.strlen的使用和模拟实现💯💯

它的函数原型如下:

size_t strlen( const char*str)

strlen函数使用规则如下:

  • 字符串以'\0'作为结束标志,strlen函数返回到是在字符串中'\0'前面出现的字符个数(不包含'\0')。
  • 参数指向的字符串必须要以'\0'结束。
  • 注意函数的返回值为size_t,是无符号的(易错)
  • strlen的使用需要包含头文件#include<string.h>

⏩3.1strlen函数的使用💯💯

好,这里首先讲一下strlen函数的基本使用
代码如下:

#include<stdio.h>
#include<string.h>
int main() {

	char arr[] = "abcdef";//字符串是以'\0'为结束标志的
	printf("%zd\n", strlen(arr));//这里因为strlen函数是size_t类型,所以最好用%zd打印,以防vs弹出警告
	//需要注意的是:strlen函数计算的是'\0'之前的字符个数
	return 0;
}

相信同学们看了上面的代码以及注释,应该能够理解代码的逻辑。

VS运行效果:
在这里插入图片描述

⏩3.1.1 strlen函数相关练习💯💯

刚刚我们讲到了要注意strlen函数的返回值为size_t,这是为什么呢?下面我们来看一下这个代码案例。

代码如下:

#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("str1>str2\n");
	}
	return 0;
}

这道题想必很多同学是这么想: 由于那个str1str2数组存放的是字符串首字符的地址,那strlen函数就是计算\0之前的字符个数。
那他们肯定觉得strlen函数计算str2数组的字符个数为3个,str1数组的字符个数为6个。所以肯定会认为strlen(str2)-strlen(str1)那个语句就是3-6=-3,是<0
那肯定会打印str1>str2这句话。那这是不对的。
我们不妨先用VS测试这个代码,看看运行效果是怎么样先~
在这里插入图片描述
我们发现它确实执行else语句那句话,为什么呢?别急,接下来博主给你娓娓道来!

在这里插入图片描述

因为本质上那个strlen函数计算字符串的相加相减都本质上都是无符号的整数的减法
那它们相减,得出的数也是无符号整数的,肯定也会大于0。这是为什么呢?
看下图:
在这里插入图片描述
相信同学们看了这个图,也能够理解更加理解这个无符号整数的意思。
因为无符号整数就是不会考虑符号位,只是关注数值位。并且无符号整数是使用该数的二进制补码来存储。因此它的数肯定是大于0的。

好,相信同学们听到这里,也会理解这个代码的逻辑了~

那如果说我们真想让代码执行>str1>str2\n那句话,该怎么做呢?
我们可以这么做,将strlen这个函数无符号size_t类型强制转换为int整型,那这样就可以打印"str2>str1\n"那句话。
VS代码运行效果:
在这里插入图片描述
通过执行结果,我们发现程序的确执行str1>str2那句话。

好,相信讲到这里,同学们应该就理解了。那我们接着就讲三种模拟实现strlen函数~

⏩3.2 strlen函数三种模拟实现💯💯

⏩3.2.1 创建临时变量count💯💯

代码如下:

#include <stdio.h>
#include <stdio.h>
size_t my_strlen(char* s)//这里我们函数my_strlen类型写成size_t,这是因为字符串的长度绝对是大于0等于0的,因此我们直接就写成size_t类型就行
 {
	int count = 0;//创建临时变量count,初始化为0
	while (*s)//当*s=='\0','\0'对应的ASCLL码值为0,0为假,便跳出while循环。
	{
		count++;//随着变量字符指针s往后遍历,count变量的值不断自增
		s++;//字符指针往后遍历
	}
	return count;
}

int main() {

	char str[] = "abcdef";
	size_t ret = my_strlen(str);//这里我们是将str首元素地址传过去
	printf("%zd\n", ret);//因为这是用size_t数据类型创建的变量ret,所以我们使用%zd来格式化输出。
	return 0;
}

相信同学们看了这个代码,以及这个注释,是能够理解这个代码逻辑的。

VS运行效果如下:在这里插入图片描述

⏩ 3.2.2 指针-指针💯💯

代码如下:

#include <stdio.h>
#include <stdio.h>
size_t my_strlen(char* s)//这里我们函数my_strlen类型写成size_t,这是因为字符串的长度绝对是大于0等于0的,因此我们直接就写成size_t类型就行
{
	char* ptr = s;//这里是将字符串首元素地址赋给指针变量ptr
	while (*s)s++;//只要*s不是'\0',*s都往后遍历
	return s - ptr;//这里本质上把字符指针s最后的地址-ptr首元素的地址,这样就能得到两个指针相差的元素个数。
}
int main() {
	char str[] = "abcdef";
	size_t ret = my_strlen(str);//这里我们是将str首元素地址传过去
	printf("%zd\n", ret);//因为这是用size_t数据类型创建的变量ret,所以我们使用%zd来格式化输出。
	return 0;
}

相信同学们看了这个代码,以及这个注释,是能够理解这个代码逻辑的。

VS运行效果如下:
在这里插入图片描述

⏩ 3.2.3 递归法求字符串长度💯💯

这里的递归法求字符串长度估计很多同学比较懵,我们先画个图分析先:
如下:
在这里插入图片描述
相信同学们看了这个图,自己应该能够很好地理解递归这个方法,大家可以自己尝试自己用递归法实现这个算法~

要是还想不出来,博主这里直接上代码~
在这里插入图片描述
代码如下:

#include <stdio.h>
#include <stdio.h>
size_t my_strlen(char* s)//这里我们函数my_strlen类型写成size_t,这是因为字符串的长度绝对是大于0等于0的,因此我们直接就写成size_t类型就行
{
	if (*s == '\0') {
		return 0;//当*s指向的元素为'\0',直接返回0,用作递归的结束条件
	}
	else {
		return 1 + my_strlen(s + 1);//如果*s指向的元素不是'\0',那么说明字符串里面的字符最少都有1个,因此我们就返回1+后面字符串中字符的长度。
	}
	
}

int main() {

	char str[] = "abcdef";
	size_t ret = my_strlen(str);//这里我们是将str首元素地址传过去
	printf("%zd\n", ret);//因为这是用size_t数据类型创建的变量ret,所以我们使用%zd来格式化输出。
	return 0;
}

这里博主这里简单画了递归调用图,大家可以看一下理解理解~
在这里插入图片描述

VS运行效果图如下:
在这里插入图片描述
我们发现,用递归法实现的算法,它的结果也是6。

🎆4.strcpy的使用和模拟实现💯💯

strcpy它的函数原型如下:

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

这里我们来解读一下,这里destination指的是目标位置的起始地址,source指的是所要拷贝那个字符串内容的起始地址。

好,我们就细细地讲一下它的规则吧~

⏩4.1 strcpy的使用规则💯💯

  • 源字符串必须以’\0’结束。
  • 会将源字符串中的’\0’拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串
  • 目标空间必须可修改

好,当我们介绍了strcpy的规则后,接下来博主将给大家讲解strcpy的模拟实现。

⏩4.2 strcpy函数的基本使用💯💯

好,接下来博主给大家演示一下strcpy函数的基本使用。

代码如下:

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[] = "abcdef";//这里的arr1数组是默认有'\0'的,因为字符串是以'\0'为结束标志的。
	char arr2[20];//这里初始化arr2数组的长度务必要确保目标内存区域足够大以容纳源字符串,否则会造成数组越界
	strcpy(arr2, arr1);//这里的strcpy库函数拷贝会顺便拷贝'\0'
	printf("%s\n", arr2);//这里打印是从arr2的首元素地址开始逐一打印字符串,直到遇到'\0'才停止。
	return 0;
}

相信大家看了博主写的代码以及注释,自己应该能够理解这个代码的逻辑。

VS运行效果如下:
在这里插入图片描述

⏩4.3 strcpy函数的模拟实现💯💯

这里可能很多同学是有点没思路的,没事,博主这里会提供思路,让大家能够深刻地理解strcpy是怎么模拟实现的~

⏩4.3.1 strcpy函数的模拟实现方法1💯💯

首先,来看下图:
在这里插入图片描述
分析: 这里我们主要是通过数组遍历的方式来逐一拷贝,因为'\0'作为字符串的结束标志。所以只要arr1数组的内容不是'\0',就在while循环内部逐一进行拷贝,每拷贝一个字符,两个指针都向后偏移一个元素。
直到遇到'\0'为止。最后当arr1指向的内容为'\0',条件为假,便跳出while循环。最后我们再把arr1的内容拷到arr2中就行。

好,当我们分析成这样,代码也能顺理成章地写出来。
代码如下:

//}

#include<stdio.h>
void my_strcpy(const char* src, char* dest)//*src指向的是arr1数组首元素的地址,*dest指向的是arr2数组首元素的地址
{
	while (*src)//当*src指向的元素是'\0',则表达式为假,便跳出while循环
	{
		*dest = *src;//将src字符串的内容一个一个地拷贝到dest中。
		dest++;//指针往后遍历
		src++;//指针往后遍历
	}
	*dest = *src;//由于之前因为*src指向的元素是'\0',所以跳出while循环,那因为\0是字符串的结束标志,之前我们没有把\0拷贝到指针变量dest中,所以这里就要把\0拷到dest。
}


int main() {

	char arr1[] = "abcdef";
	char arr2[20];
    my_strcpy(arr1,arr2);//调用my_strcpy函数,把arr1作为源地址,将arr2作为作为目标地址
	printf("%s\n", arr2);//这里以%s打印实质上是拿到arr2首元素的地址,逐一往后打印字符串,直到遇到'\0'为止
	return 0;
}

相信同学们看了这个代码,应该是能够理解这个代码的逻辑

vs运行效果:
在这里插入图片描述

但是我们认为这个代码还是有待改进的,接下来博主将细细讲一下。

首先,我们先打开官网查一下这个函数先。
如图:
在这里插入图片描述
从图中,我们可以看出函数返回值是char*类型的,并且我们发现它返回的是目标字符指针的起始地址,属于我们要创建个指针变量来充当destinmation的起始地址,到时直接返回这个指针变量即可。
如下:

题目分析:
//------1.参数顺序------
//函数的功能,停止条件
//3.assert判断字符串是否为空指针,assert函数头文件为:#include<assert.h>
//4.用const修饰源指针,使其内容不得修改
//5.函数返回值 char* 

那同学们可以根据博主上面的改进代码分析,可以自己尝试改进上面的代码。一会我们会进行讲解~
好,如果大家看了上面的改进代码分析,还是想不到思路的话,可以看一下博主的代码以及注释,自己尝试理解消化一下。
在这里插入图片描述
代码如下:

#include<stdio.h>
#incldue<assert.h>
char* my_strcpy(const char* src, char* dest) //arr1,arr2
{
	assert(src!=NULL);//用assert断言一下,分别判断src和dest是否都为空指针
	assert(dest!=NULL);
	char* ret = dest;//创建个指针变量ret,将src字符指针首元素的地址赋给指针变量ret
	while (*dest++=*src++)//这里首先是先对dest字符指针和src字符指针解引用,将src字符赋给dest,然后两个字符指针++,意思是说两个字符指针统一向后偏移一个元素,直到src字符指针指向的元素为'\0',那也就是整个表达式结果就为'\0',即为假,则跳出while循环。
	{
		;
	}
	return ret;//这里返回的是dest首元素的地址
}


int main() {
	char arr1[] = "abcdef";
	char arr2[20];//创建这个arr2数组要比arr1数组空间要大,创建小了,如果源字符串的长度还比arr2数组还大,拷贝会造成数组越界
  	my_strcpy(arr1, arr2);//调用my_strcpy函数,把arr1作为源地址,将arr2作为作为目标地址
	printf("%s\n", arr2);//这里以%s打印实质上是拿到arr2首元素的地址,逐一往后打印字符串,直到遇到'\0'为止
	return 0;
}

这个代码有个地方写得很好,就是while (*dest++=*src++)这句话,为什么呢? 因为这里既能做到把arr1数组的内容全部拷贝到数组arr2,同时也能做到当*src='\0'的时候,表达式为假,便跳出while循环。
顺便提一下: 这个题目是出自<<高质量C/C++编程》书籍最后的试题部分。
对了,如果同学们想要这本书的电子版,可以私信博主领取,我私发给大家!

🎆5.strcat的使用和模拟实现💯💯

⏩5.0.1 strcat函数简单介绍💯💯

⏩5.0.1.1什么是strcat函数呢?函数原型是什么?💯💯

strcat函数是C语言中的一个字符串拼接函数,它的功能是在一个字符串后面追加上另外一个字符串。
它的函数原型如下:

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

具体函数介绍如下:
在这里插入图片描述
从图中: 和我们之前介绍的strcpy函数一样,返回的类型都是char*,然后它返回到也是字符指针destination的地址。
同时,我们需要注意的是: strcat函数在拼接字符串的时候会自动在合成字符串的末尾添加'\0'

⏩5.1 strcat的使用规则💯💯

  • 源字符串必须以’\0’结束。
  • 目标字符串中也得有'\0',否则没办法也不知道追加从哪里开始。
  • 目标空间必须有足够的大,能容纳源字符串的内容。
  • 目标空间必须可修改。

⏩5.2 strcat的使用和模拟实现💯💯

⏩ 5.2.1strcat的使用💯💯

好,接下来给大家演示一下strcat是怎么用的,大家可以看一下下面的代码~
代码如下:

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strcat(arr1,arr2);//这里实质上是将arr2数组里面的内容拼接到arr1数组中,顺便带上'\0'。
	printf("%s\n", arr1);
	return 0;
}

这里如果同学们看了代码还是不太理解它strcat函数的如何进行拼接的话,不要紧~
博主刚刚对那个代码进行调试了一下,动图如下所示:
在这里插入图片描述
细心的话: 我们从动图可以看出,原本数组arr1的内容中的空格字符后面是跟着一个'\0'的,但是经过strcat函数的拷贝后,那个'\0'就给覆盖掉了。
另外,当strcpy函数把arr2全部内容都拷到arr1数组中,会自动在arr1合成字符串中添加一个'\0'字符。
那我们根据这个动图分析 ,自然也能将这个图给画出来,如下:
在这里插入图片描述
所以,它本质上还是用arr2数组中的'w'字符将'\0'给覆盖掉,在拼接后的字符串完的后面添加一个'\0',以此作为字符串的结束标志。
相信同学们看了这个图应该是能够大彻大悟的~

那博主接下来再用VS执行一下这个代码,看看分析得是否正确吧~
在这里插入图片描述

VS运行效果:
在这里插入图片描述
从运行结果来: 我们的分析是正确的,确实是把hellow world这个字符串给打印出来。

接下来,我们就讲一下那个strcat函数的模大家拟实现吧~

⏩ 5.2.2 strcat的模拟实现💯💯

这里可能也会有同学对于strcat不知道如何自己模拟实现,别急,博主分析一下你们就懂啦~
这里是我们实现strcat函数的步骤
如下图所示:
在这里插入图片描述
相信同学们看了这幅图,自己也许有点思路了,但是有些同学可能还是不太懂怎么实现这个算法。

那么博主这里就自己动手实践写了这个代码,并且写了详细的注释,希望同学们能够理解~
代码如下:

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(const char*src,char*dest) //用const修饰源字符串src,以免被修改
{
	assert(src != NULL);
	assert(dest != NULL);//判断两个字符串是否为空指针
	//assert(src && dest);//assert断言写成这样也行,因为NULL的值就为0,&&只要左右两边任意一个表达式0,都是为假的
	char* ret = dest;//创建临时指针变量ret来接收dest的起始地址
	while (*dest) //找到dest字符串的'\0'的位置
	{
		dest++;//逐一开始往后遍历字符串dest
	}
	while (*dest++=*src++);//将src字符串的内容逐一拷贝到,直到遇到'\0'时,拷贝完成后,整个表达式为假,直接跳出while语句
	return ret;
}

int main() {

	char arr1[20] = "hello ";
	char arr2[] = "world";
	char*tmp=my_strcat(arr2,arr1);//这里我们用tmp字符指针变量来接受返回的dest起始地址
	printf("%s\n", tmp);//这里的话主要是用arr1首元素的地址开始打印字符串,直到遇到'\0'才停止。
	return 0;
}

代码分析: 相信同学们看了博主写的代码以及注释,应该能够理解这个代码逻辑的,那接下来我们提一下有个代码是有改进之处的,我们发现那个my_strcat函数中的assert断言是可以改写成assert(src && dest)
或许有同学不理解,我们来解释一下~
如图:
在这里插入图片描述
我们发现那个空指针NULL是为0的。而因为之前我们讲&&逻辑与操作符的时候,但凡&&左右一侧为0,那整个表达式都为假。

好,解释了那么多,我们不妨用VS测试一下我们的代码,看看它的运行结果是否符合我们的预期把~
VS运行效果如下:
在这里插入图片描述
我们发现,VS运行结果确实是符合我们预期的,就说明我们这个模拟实现strcat函数的代码逻辑上是没错的。

好,今天的内容我们暂时就讲到这里,希望大家好好吸收这篇博客中介绍的函数,下去多去用这些函数,这样才能学会的~

当然博主这次讲的字符函数和字符串函数(一)仅仅只是一小部分,后续博主会更深层地介绍其他C语言字符和字符串函数,大家就敬请期待吧~

**好,讲到这里,如果大家觉得这篇博客有哪些内容讲得还不太懂,可以私信一下博主,我会给你讲明白。 **

https://img-blog.csdnimg.cn/direct/4df59a6f3b224651851eb00ecb8736db.gif#pic_center

** 如果觉得博主不错的话,欢迎一键三连支持一下博主,谢谢大家!!!**

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测

回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测 目录 回归预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM多变量回归预测…

ffmpeg解码和渲染理解

ffmpeg解码和渲染理解 ffmpeg视频解码步骤 FFmpeg 是一个功能强大的跨平台多媒体处理工具&#xff0c;包含了音视频编解码、封装/解封装、过滤器等功能。下面是一般情况下使用 FFmpeg 进行视频解码的步骤&#xff1a; 初始化 FFmpeg 库&#xff1a;首先需要初始化 FFmpeg 库&a…

linux系统达梦数据库(安装及操作)

新建 dmdba 用户 注意: 安装前必须创建 dmdba 用户&#xff0c;禁止使用 root 用户安装数据库。 创建用户所在的组&#xff0c;命令如下&#xff1a; groupadd dinstall 创建用户&#xff0c;命令如下&#xff1a; useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba 修…

一文彻底搞懂OSI七层模型和TCP/IP四层模型

文章目录 1. OSI七层模型2. TCP/IP四层模型 1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的…

口才提升秘籍:马云的说话之道你也能学会!

口才提升秘籍&#xff1a;马云的说话之道你也能学会&#xff01; 在商界&#xff0c;马云以其卓越的领导才能和出色的口才赢得了广泛的赞誉。他的每一次演讲都充满智慧和力量&#xff0c;不仅激发了员工的斗志&#xff0c;也赢得了合作伙伴的信任。那么&#xff0c;马云是如何…

ctf杂项总结

1.文件无法打开 1.1.文件拓展名损坏/错误导致 方法&#xff1a; 1.使用kali当中的file命令查看&#xff0c;之后修改为正确的后缀即可 2.通过16进制编辑器打开查看文件头 3.文件头残缺/错误&#xff0c;可以先使用kail当中的file命令查看它的类型&#xff0c;之后再通过 16…

基于springboot实现驾校信息管理系统项目【项目源码+论文说明】

基于springboot实现驾校信息管理系统演示 摘要 随着人们生活水平的不断提高&#xff0c;出行方式多样化&#xff0c;也以私家车为主&#xff0c;那么既然私家车的需求不断增长&#xff0c;那么基于驾校的考核管理也就不断增强&#xff0c;那么业务系统也就慢慢的随之加大。信息…

运维自动化之ansible工具

目录 前言 一、Ansible 工具概述 1、Ansible 功能 2、Ansible 特性 3、Ansible 优缺点 4、Ansible 架构 4.1 Ansible 组成 4.2 Ansible 命令执行来源 二、Ansible 安装和基础用法 1、Ansible 安装 1.1 yum源安装 1.2 使用python编译安装 1.3 Git方式安装 2、Ansib…

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库&#xff0c;但是MySQL是传统的关系型数据库&#xff0c;MongoDB则是非关系型数据库&#xff0c;也叫文档型数据库&#xff0c;是一种NoSQL的数据库。它们各有各的优点&#xff0c;来看看他们之…

天地图全国幼儿园数据下载与处理分析

概述 在看天地图服务资源的时候看到有个“幼儿园”的数据&#xff0c;好奇点开看了下&#xff0c;下载下来数据差看了下&#xff0c;数据质量还不错。本篇文章给大家分享一下这个数据的处理以及一些简单的统计分析结果。 数据下载 通过地址https://service.tianditu.gov.cn/…

Flutter 多语言、主题切换之GetX库

多语言、主题切换之GetX库 前言正文一、配置项目二、模拟UI三、语言配置① 常量键② 语言配置文件③ 配置 四、持久化五、切换语言① my_home.dart② home.dart③ mine_controller.dart④ language_setting_controller.dart⑤ language_setting.dart⑥ mine.dart 六、切换主题①…

流水账-20240314

目录 Linux系统删除文件后&#xff0c;磁盘大小没变化mysql事务和neo4j事务冲突误诊描述解决方法网上提供的方法重置Neo4j密码&#xff0c;成功解决问题高版本低版本 Linux系统删除文件后&#xff0c;磁盘大小没变化 lsof L1|grep 删除的文件名kill进程 mysql事务和neo4j事务…

VC-旅游系统-213-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态&#xff0c;充分了解对客户…

高等数学相关知识点整理汇总

说明&#xff1a;由于工作原因可能更新不及时&#xff0c;内容逐步完善中… 一、空间解析几何与向量代数 二、多元函数的微分学 三、重积分 四、曲线积分与曲面积分 五、常微分方程 六、无穷级数

Qt 5.14.2插入VTK 9.0.1 窗口并绘制图形

文章目录 准备环境使用VS创建Qt Widget项目配置VTK依赖调试C/C链接器 添加vtk窗口测试代码 参考链接&#xff1a; VS2017配置QT环境(详细版)_vs2017 qt-CSDN博客 QT5VTK9.1最新配置方法_qt vtk-CSDN博客 VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget-CSDN博客 准…

音视频实战---读取音视频文件的AAC音频保存成aac文件

1、使用avformat_open_input函数打开音视频文件 2、使用avformat_find_stream_info函数获取解码器信息。 3、使用av_dump_format设置打印信息 4、使用av_init_packet初始化AVPacket。 5、使用av_find_best_stream查找对应音视频流的流下标。 6、使用av_read_frame读取音视…

深信服技术认证“SCCA-C”划重点:深信服应用交付AD

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…

leetcode代码记录(找到小镇的法官

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 小镇里有 n 个人&#xff0c;按从 1 到 n 的顺序编号。传言称&#xff0c;这些人中有一个暗地里是小镇法官。 如果小镇法官真的存在&#xff0c;那么&#xff1a; 小镇法官不会信任任何…

如何做好适老化设计?适老化设计组件库必不可少

我以前读过一篇文章&#xff0c;中国有2.5亿老年人被智能手机“抛弃”&#xff0c;这让人们非常难过。在当今时代&#xff0c;智能手机和互联网已经成为日常生活的一部分&#xff0c;不会上网和使用手机的老年人到处“困难”&#xff0c;比如旅行看健康代码&#xff0c;买东西扫…

C++面试题和笔试题(四)

一、intx[6][4],(*p)[4];px;则*(p2)指向哪里&#xff1f; A X[0][1]B X[0][2]C X[1][0]D X[2][0] 官方解释&#xff1a; D int x[6][4], (*p)[4]; p x; 在这里&#xff0c;x 是一个二维数组&#xff0c;它有6行和4列。p 是一个指向具有4个整数的数组的指针。 当你执行…