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

news2024/11/17 15:27:26

在这里插入图片描述

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

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

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

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

相关文章

DXP软件界面显示“No Hard Devices”【简单的操作问题】加【软件下载】

目录 一&#xff0c;DXP软件界面显示“No Hard Devices” 二&#xff0c;软件下载的百度网盘资源 一&#xff0c;DXP软件界面显示“No Hard Devices” Protel DXP是2004是澳大利亚Altium公司于2002年推出的一款电子设计自动化软件。它的主要功能包括&#xff1a;原理图编辑、印…

北斗卫星推动数智油田建设

北斗卫星推动数智油田建设 中国石油大港油田采油三厂深入推动北斗智能终端在智能巡检、安全监督、油井导航、坐标测绘等多场景应用&#xff0c;实现了人工查井向智能巡检的变革。截至2月下旬&#xff0c;场景覆盖率达100%&#xff0c;高效助推大港南部“双高”老区数智油田建设…

修改vscode的相对路径计算逻辑

vscode的相对路径计算逻辑是&#xff0c;"./"表示当前项目的文件夹&#xff0c;而不是当前文件所在的文件夹 做出如下修改&#xff1a; File-->Preferences-->settings 搜索Execute in File Dir , 然后取消勾选

TikTok新手如何起号?环境因素与内容创新技巧

相信很多刚入行的TikTok玩家都遇到过一个难题&#xff0c;那就是账号权重低&#xff0c;播放量在个位数徘徊&#xff0c;其实都是因为还没起号&#xff01;那么具体如何起号呢&#xff1f;下面小编也给大家分享一下技巧。 一、如何起号 1、明确注册 TikTok 账号的目的 无论是…

Linux 管道

目录 一、认识管道 二、匿名管道 pipe函数 用法&#xff1a; pipefd&#xff1a; 匿名管道通信&#xff1a; 三、命名管道 概念&#xff1a; 创建&#xff1a; 特性&#xff1a; 用途&#xff1a; 四、命名管道和匿名管道的区别 命名&#xff1a; 持久性&#xff1a;…

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写&#xff0c;以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL&#xff08;数据定义语言&#xff09; 用于数据库、数据表、字段的定义的语言 create by 表名 &#xff08;表里有什么字段&#xff09;…

力扣经典题:化栈为队

整体思路&#xff1a;入栈然后出栈&#xff0c;操作就和队列相同了 大佬的代码 typedef struct Node {int val;struct Node* next; }Node; Node* newNode(int Val) {Node* n(Node*)malloc(sizeof(Node));n->valVal;n->nextNULL;return n; } void push(Node* Head,int Va…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4&#xff08;MPEG-4 Part 14&#xff09;是一种通用的视频文件格式&#xff0c;广泛用于多媒体应用。作为MPEG-4标准的一部分&#xff0c;MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

c语言大小写字母的转换

通过ascll码表我们可以知道大写字母与小写字母相差32个数&#xff08;小写字母比大写字母大&#xff09;。因此&#xff0c;通过相加减32即可转换大小写字母。 #include <stdio.h>int main() {char ch c;char CH A;printf("%c\n", ch - 32);printf("%c…

网工内推 | 上市公司网工,IE认证优先,最高18K*13薪,包吃住

01 深圳市宝腾互联科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、是整个数据中心的网络技术及安全问题的负责人&#xff0c;确保数据中心业务的正常进行&#xff1b; 2、负责规划、设计、搭建、维护数据中心的网络环境&#xff0c;确保IDC /云平台&a…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

第五十五天| 583. 两个字符串的删除操作、72. 编辑距离

Leetcode 583. 两个字符串的删除操作 题目链接&#xff1a;583 两个字符串的删除操作 题干&#xff1a;给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思考&#xff1a;动态规划。本题中…

现已修复!微软 SmartScreen 漏洞被用于分发 DarkGate 恶意软件

昨天&#xff08;3月13日&#xff09;&#xff0c;趋势科技分析师报告称有黑客利用Windows SmartScreen 漏洞在目标系统投放DarkGate 恶意软件。 该漏洞被追踪为 CVE-2024-21412 漏洞&#xff0c;是一个 Windows Defender SmartScreen 漏洞&#xff0c;它允许特制的下载文件绕…

Self-supervised Contextual Keyword and Keyphrase Retrieval with Self-Labelling

文章目录 题目摘要方法数据集实验 题目 通过自我标记进行自我监督的上下文关键字和关键词短语检索 论文地址&#xff1a;https://www.preprints.org/manuscript/201908.0073/v1 项目地址&#xff1a;https://github.com/naister/Keyword-OpenSource-Data 摘要 在本文中&#x…

SE园区综合实验(未补齐版)

实验要求&#xff1a; 1.局域网存在vlan10和vlan20两个业务vlan&#xff0c;ip网段分别对应192.168.1.0/24和192.168.2.0/24 2.业务vlan可以在所有链路上传输数据 3.sw1和sw2之间的直连链路上配置静态链路聚合实现链路冗余&#xff0c;并提高链路带宽 4.sw3为某接入点二次交…

【教学类-34-11】20240314 动物拼图(Midjounery生成线描图,8*8格拼图块 A4整张)(AI对话大师)

作品展示&#xff1a;——A4整页&#xff08;一人2张纸&#xff09; 背景需求&#xff1a; 通过春天拼图的个别化实验&#xff0c;我发现&#xff1a; 【教学类-34-10】20240313 春天拼图&#xff08;Midjounery生成线描图&#xff0c;4*4格拼图块&#xff09;&#xff08;AI…

单例模式( Singleton)——创建型模式

单例模式——创建型模式 什么是单例模式&#xff1f; 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象&#xff0c; 过一会儿后你决定再创建一个新对象&#xff0c; 此…

【Memcached】

memcached 有一个很大的缺陷不能持久化&#xff0c;不能存储在硬盘里 1.NoSQL介绍 NoSQL是对 Not Only SQL、非传统关系型数据库的统称。 NoSQL一词诞生于1998年&#xff0c;2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。 随着互联网时代的到…

Node.js 学习笔记 fs、path、http模块;模块化;包;npm

Node.js学习 Node.js一、定义1.前端工程化2.Node.js 为何能执行 JS&#xff1f;3.安装nodejs、删除之前的nodejs4.使用 Node.js 二、fs模块 \- 读写文件三、path 模块案例 - 压缩前端html四、HTTP相关URL中的端口号常见的服务程序http 模块-创建 Web 服务案例&#xff1a;浏览时…

【Flutter 面试题】Flutter如何处理响应式布局?

【Flutter 面试题】Flutter如何处理响应式布局&#xff1f; 文章目录 写在前面口述回答补充说明完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&am…