C语言:字符函数,字符串函数

news2024/9/21 2:35:47

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数。

一. 字符分类函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件件是 ctype.h

  1. 函数       如果他的参数符合下列条件就返回真
     
  2. iscntrl     任何控制字符
  3. isspace  空白字符:空格',换页“f,换行"n',回车“r’,制表符"t'或者垂直制表符'v'
  4. isdigit     十进制数字 '0’~'9’字符
  5. isxdigit    十六进制数字,包括所有十进制数字字符,小写字母a~f,大写字母A~F
  6. islower    小写字母a~z
  7. isupper   大写字母A~Z
  8. isalpha   字母a~z或A~Z
  9. isalnum  字母或者数字,a~z,A~Z,0~9
  10. ispunct   标点符号,任何不属于数字或者字母的图形字符(可打印)
  11. isgraph   任何图形字符
  12. isprint     任何可打印字符,包括图形字符和空白字符

接下来我们就举个例子

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

既然要将小写字母转换为大写字母,那么我们就要找到小写字母,根据上面的函数我们知道判断是否为小写字母我们可以用islower函数,找到后我们就要进行转换,根据Ascll值可知小写到大写只需要减去32即可,这样我们就得到了我们的代码了。

#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 (islower(c))
			c -= 32;
		putchar(c);
		i++;
	}
	return 0;
}

二. 字符转换函数 

C语言提供了2个字符转换函数:

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

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

既然这样,那我们就可以利用toupper函数将上面的代码进行修改

#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 (islower(c))
			c = toupper(c);
		putchar(c);
		i++;
	}
	return 0;
}

三.字符串函数

1. strlen 的使用和模拟实现 

形式

size_t strlen ( const char * str );

  • 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为 size_t,是无符号的。
  • strlen的使用需要包含头文件,string.h
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdef";
	size_t len = strlen(arr);
	printf("%zd\n", len);
	return 0;
}

57cb9b9c5bde4bbd89c844709b9528b6.png

strlen的模拟实现:

计数器的方式

#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

指针-指针

#include<stdio.h>
#include<assert.h>
int my_strlen(char* str)
{
	char* pa = str;
	assert(str);
	while (*str != '\0')
	{
		str++;
	}
	return str - pa;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

函数递归

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

运行结果

ed30e52ea37e41739d8dfaa76a86e66e.png

 2.strcpy 的使用和模拟实现

形式

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

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

在使用strcpy函数时我们会创建两个数组arr1,arr2,如果我们想要将arr1中的内容拷贝到arr2中,首先我们创建的arr2要有足够大的空间,在strcpy函数中我们先存放的时目的地(arr2),然后存放源头(arr1),既strcpy(arr2, arr1);

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "Hello World";
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

c175220f20854722867b5d1da1d1ba18.png

既然我们已经了解了他的用法,那么就让我们模拟实现一下strcpy吧

模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* str, const char* stc)
{
	char* ret = str;
	assert(str && stc);
	while (*str++ = *stc++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello World";
	char arr2[20] = { 0 };
	char* ret=my_strcpy(arr2, arr1);
	printf("%s\n",ret);
	return 0;
}

在函数中我们先将目标首地址赋给ret,然后进入循环将stc的值赋给str,并不断的向下走,直到为\0的时候停下,并将首地址返回。

309cfc7db61a4d28b6126e593e79f492.png

3.strcat 的使用和模拟实现

形式 

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

  • 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个 \0 字 符。 
  • 如果source 指向的字符串的长度小于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "World!";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

bd463a3022a4418bb70d1dd345b47a64.png

模拟实现 

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* str,const char* stc)
{
	char* ret = str;
	assert(str && stc);
	while (*str != '\0')
		str++;
	while (*str++ = *stc++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "Hello ";
	char arr2[] = "World!";
	char* ret = my_strcat(arr1, arr2);
	printf("%s\n", ret);
	return 0;
}

我们先让目标地址找到\0,然后进入循环将stc的值赋给str,并不断的向下走,直到为\0的时候停下,并将首地址返回。

23f8a7932b0d4c61befa616bd8aac17f.png

4.strcmp 的使用和模拟实现

形式

int strcmp ( const char * str1, const char * str2 );

  • 第⼀个字符串大于第二个字符串,则返回大于0的数字
  • 第⼀个字符串等于第二个字符串,则返回0  
  • 第⼀个字符串小于第二个字符串,则返回小于0的数字

实现原理

比较两个字符串中对应位置上字符ASCII码值的大小。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcd";
	int ret =strcmp(arr1, arr2);
	printf("%d", ret);
	return 0;
}

b466abf8ce724e5d8339ca3bf586690c.png

 模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp (const char * str1, const char * str2)
{
	int ret = 0;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcd";
	int ret = my_strcmp(arr1, arr2);
	printf("%d", ret);
	return 0;
}

只要指针指向的地方str1=str2就进行循环继续寻找,直到str1!=str2时退出循环返回*str1-*str2 ,或者*str1=='\0'就是全部比完了,没有差别,返回0。如果返回大于0的数就是大于,小于0的数就是小于,返回0就是等于。

d12fb841389141d890a93842a38c4965.png

根据前面的几个函数我们发现,我们都是在拷贝全部,追加全部,比较全部的字符,那么我们能不能控制拷贝,追加,比较的个数呢,其实时可以的,那么我们就来看一下下面的几个函数吧。

5.strncpy 的使用和模拟实现

形式

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

  •  拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

诶,我们发现相较于strcpy函数strncpy函数只是多了个num,这其实就是对最大个数的限制

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "Hello World!";
	char arr2[20] = { 0 };
	strncpy(arr2, arr1, 2);
	printf("%s", arr2);
}

7f2910b1fc7f41d3ace2b274ca903381.png 模拟实现 

#include<stdio.h>
char* my_strncpy(char* str1,const char* str2,int x)
{
	char* ret = str1;
	while (x)
	{
		*str1++ = *str2++;
		x--;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello World!";
	char arr2[20] = { 0 };
	char* ret = my_strncpy(arr2, arr1, 2);
	printf("%s", ret);
}

当然,我们也可以发现对于个数的限制其实无非是对循环次数加以限制,因为我们要两个数所以只要进行两次循环即可,所以我们让x作为循环条件,每循环一次就减一,这样就成功实现了对个数的限制了,嘻嘻,看,我们也成功的只拷贝了两个字符了吧; 

bb9c80f77fa34715b67902e6e5baf04b.png

6. strncat 的使用和模拟实现

形式

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

  • 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符。 
  • 如果source 指向的字符串的长度小于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

我们发现其实还是多了个num,对最大个数的限制。

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "Hello ";
	char arr2[] =  "World!";
	strncat(arr1, arr2, 2);
	printf("%s", arr1);
	return 0;
}

4263b892a9294daa98df83296a4334df.png 模拟实现

#include<stdio.h>
char* my_strncat(char* str1,const char* str2, int x)
{
	char* ret = str1;
	while (*str1)
	{
		str1++;
	}
	while (x)
	{
		*str1++ = *str2++;
		x--;
	}
	return ret;
}
int main()
{
	char arr1[20] = "Hello ";
	char arr2[] =  "World!";
	char* ret = my_strncat(arr1, arr2, 2);
	printf("%s", ret);
	return 0;
}

相较于strcat函数的模拟实现strncat函数的模拟实现无非时对个数的限制也无非是对循环次数加以限制让x作为循环条件,每循环一次就减一,以实现我们想要的结果。

baa8915911e1405c970d68f7a21df767.png

7. strncmp 的使用和模拟实现 

形式

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

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abccef";
	int ret =strncmp(arr1, arr2, 4);
	printf("%d", ret);
	return 0;
}

695ef1723b0b4f1e9a9fa78f92297dd1.png

模拟实现 

#include<stdio.h>
#include<assert.h>
int my_strncmp(char* str1, const char* str2, int x)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		x--;
		if (x == 0)
		{
			break;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;

}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abccef";
	int ret = my_strncmp(arr1, arr2, 4);
	printf("%d", ret);
	return 0;
}

在我们上面学习的strcmp函数的基础上让x在循环中x--;并利用if语句让x=0时跳出循环,达到比较x个字符的目的。 

b95e5ec3863b440b89fe5436455314e5.png

好了, 我们发现利用这几个函数我们实现了控制拷贝,追加,比较的个数,并且在我们的努力下模拟函数上也成功进行了个数的控制。

8. strstr 的使用和模拟实现

strstr 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。

形式

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

  • 函数返回字符串str2在字符串str1中第一次出现的位置
  • 字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志 
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cde";
	char* ret=strstr(arr1, arr2);
	printf("%s",ret );
	return 0;
}

 a0ce69068e9a4bc1b232304688796717.png模拟实现 

#include<stdio.h>
#include<assert.h>
char* my_strstr(char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cur = str1;
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cde";
	char* ret = my_strstr(arr1, arr2);
	printf("%s", ret);
	return 0;
}

1.首先先将两个字符串的地址传过去,给str1和str2,然后在函数中创建两个指针接收str1和str2的地址并且创建一个cur指针存放str1的首地址。

2.之后创建一个循环如*s1,*s2,*s1==*s2就让指针s1++,s2++,如果*s2=='\0',就返回cur,因为一旦*s2=='\0'就证明字串全部找到了,就可以直接返回了。

3.但是要返回的 str1字符串是从 str2第一次出现的位置开始到 str1结尾的字符串根据代码我们要返回的是cdef,所以我们需要改变cur的起始地址,

所以我们在循环外再创建一个循环,循环条件为*cur,在循环里s1=cur,s2=str2,并且只要内循环条件不成立,就让cur++,并且重新给s1,s2赋值,但由于cur++,所以只要不等一次s1指针和cur指针就会向前移动一位,并且只要*cur!='\0'就能循环,一旦为'\0'就会退出循环返回NULL。

f895562eae694807802735bdfe1de254.png

9.strtok 函数的使用

形式

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

  • sep参数指向一个字符串,定义了用作分隔符的字符集合
  • 第以个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且 可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "zmingtao@115.com";
	char* sep = "@.";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}

eb182b2f64e4468faaa59e61bceb943c.png

10. strerror 函数的使用

形式

char* strerror ( int errnum );

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

 打印⼀下0~10这些错误码对应的信息

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

我们可以看看vs中的结果 

b94042259ab64ac18ae7356bf96b5e24.png

当然我们也可看下例子,当然我们现在不用学习,只需要简单看下结果即可。

举例如果我们想要打开的文件 

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

a3088858d57843878628cc8b48a69e02.png

当然我们也有一个函数能直接打印错误信息,并且再错误信息前会自动打印冒号和空格。

perror函数

他其实是由printf和strerror组成的。

#include <errno.h>
#include <string.h>
#include <stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("文件打开失败,原因是");
		return 1;
	}
	//打开成功
	// ....
	 
	//关闭文件
	fclose(pf);
		pf = NULL;
	return 0;
}

56fea131a95b4c86ac09591f8402b41b.png

好了今天的分享就到这里了,还请大家多多关注,我们下一篇见!

 

 

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

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

相关文章

你知道AI模型是如何学习的吗?

在人工智能的广阔天地中&#xff0c;AI模型的学习方式不仅决定了其智能行为的深度和广度&#xff0c;更是推动技术进步和应用创新的关键动力。随着AI技术的飞速发展&#xff0c;我们越来越意识到&#xff0c;深入了解AI的学习机制对于把握其潜能至关重要。 我们将从基础概念出…

hive之greatest和least函数

1、greatest函数&#xff1a; greatest(col_a, col_b, ..., col_n)比较n个column的大小&#xff0c;过滤掉null或对null值进行处理&#xff0c;当某个column中是string&#xff0c;而其他是int/double/float等时&#xff0c;返回null&#xff1b; 举例&#xff1a; select g…

Python 中的变量赋值、多重赋值

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在编程中&#xff0c;变量赋值是最基础的操作之一。Python 作为一门动态类型语言&#xff0c;其变量赋值和多重赋值具有独特的灵活性和简洁性。本文将详细介绍 Python 中的变量赋值、多重赋值&#xff0c;并包含…

基于Ascend C的Matmul算子性能优化最佳实践

矩阵乘法是深度学习计算中的基础操作&#xff0c;对于提升模型训练和推理速度至关重要。昇腾AI处理器是一款专门面向AI领域的AI加速器&#xff0c;其AI Core采用达芬奇架构&#xff0c;以高性能Cube计算引擎为基础&#xff0c;针对矩阵运算进行加速&#xff0c;可大幅提高单位面…

JavaScript 逆向爬取实战

准备介绍&#xff1a; 当我们学习完整个 JS 逆向技巧后&#xff0c;这里是一次完整的分析爬取实战 案例介绍 本节案例网站不仅在 API 参数有加密&#xff0c; 而且前端 JS 也带有压缩混淆&#xff0c;其前端压缩打包工具使用 webpack , 混淆工具使用 javascript-obfuscator 。…

Spring @Transactional事务传播行为详解

目录 一、无事务情况 二、有事务情况 REQUIRED SUPPORTS MANDATORY REQUIRES_NEW NOT_SUPPORTED NEVER NESTED Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。 在复杂的业务场景中&#xff0c;多个事务方法之间的调用可能会导致事务的一致性&…

谷粒商城【renren-fast-vue】:npm install 报错

谷粒商城【renren-fast-vue】&#xff1a;npm install 报错 报错信息报错原因解决办法 报错信息 谷粒商城【renren-fast-vue】&#xff1a;npm install 报错 npm install 下载依赖的时候报错sass 版本与 node 版本不对应 报错原因 直接使用 npm 下载依赖&#xff0c;可能会…

RCE技巧

RCE技巧 Linux命令长度限制突破方法8个字符限制绕过过滤英文字母和数字php版本7php版本5 Linux命令长度限制突破方法 8个字符限制绕过 <?php <?php $param $_REQUEST[param]; if (strlen($param) < 8) {echo shell_exec($param); }shell_exec — 通过 shell 执行…

【大模型从入门到精通14】openAI API 构建和评估大型语言模型(LLM)应用2

这里写目录标题 评估大型语言模型&#xff08;LLM&#xff09;输出的方法构建评估标准实施评估协议利用专家比较案例研究评估客户服务聊天机器人学术文本摘要高级评估技术 评估大型语言模型&#xff08;LLM&#xff09;输出的方法 评估大型语言模型&#xff08;LLM&#xff09…

甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文

论文真题 软件设计(Software Design,SD)根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

无人机之电机篇

一、无人机使用什么类型的电动机 无人机主要使用直流无刷电机和伺服电机。 直流无刷电机通常用于无人机的推进系统&#xff0c;因为它具有强大的驱动力和高功率输出&#xff0c;能够为无人机提供足够的推力。 此外&#xff0c;直流无刷电机具有电动机启动转矩大、无刷向触点…

MTF-SFR总结/探讨

空间频率响应&#xff08;SFR&#xff09;定义 在iso12233:2000中&#xff0c;空间频率响应&#xff08;SFR&#xff09;测量被定义为通过分析倾斜黑白边缘附近的相机数据而测量的值。 图像清晰度测试方法 通过ISO12233测试图像清晰度的方法&#xff0c;一般有 TVline测试和S…

去中心化技术的崛起:探索Web3的新时代

引言&#xff1a; Web3是互联网发展的新阶段&#xff0c;它通过去中心化技术重新定义了数字世界的运作方式。这一新时代不仅带来了技术上的突破&#xff0c;也为社会互动和数据管理开辟了新的前景。本文将深入探讨Web3的核心技术、应用领域、全球影响以及面临的挑战&#xff0…

nvm的下载和使用(Windows)

NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具&#xff0c;它允许用户在同一台机器上安装和使用多个Node.js版本。 一、NVM的基本功能 多版本支持&#xff1a;NVM允许用户在同一台机器上安装多个Node.js版本&#xff0c;方便处理不同…

极光流星大爆发

卑微仔广东持续200%含云量&#xff0c;线上观望大家分享的极光与流星共舞的神奇场景。 极光与流星相伴的瞬间&#xff0c;永远震撼于绝美的星空 开始放毒&#xff08;放图放图&#xff09;&#xff08;以下均拍摄于12日晚至13日晨这一时间段&#xff09;&#xff1a; 先驱猎光…

Qt之2048项目的介绍

文章目录 前言项目介绍项目截图技术介绍1. Qt 框架2. 界面绘制3. 用户输入4. 游戏逻辑5. 音效处理总结前言 2048 是一款流行的益智游戏,通过滑动屏幕上的数字方块,使相同的数字合并并生成更大的数字,最终目标是生成2048这个数字。本文介绍了基于 Qt 框架开发的一个 2048 游…

超声波清洗机哪个品牌好用?品质上等的超声波眼镜清洗机评选

随着科技的发展&#xff0c;超声波清洗机已经成为了人们生活中的清洁神器&#xff0c;它只需要清水便可以清洗假牙、刮胡刀、牙刷、眼镜、化妆工具等小物件&#xff0c;而且能够清洗到物件中的角落缝隙&#xff0c;在专业设备上还同时具备消毒除菌的功能&#xff0c;既能保证清…

软件检测报告的客观性与权威性如何确定

确保软件检测报告的客观性与权威性乃是软件测试进程中的关键要素&#xff0c;以下乃是若干确保报告质量与信誉的举措&#xff1a; 其一&#xff0c;拣选获认证的测试机构&#xff1a;选取具备 CMA&#xff08;中国计量认证&#xff09;以及 CNAS&#xff08;中国合格评定国家认…

AxMath保姆级安装教程(word联用)及使用TIPS

一、软件介绍 AxMath是一款数学公式编辑器软件。它提供了一个直观的界面&#xff0c;使用户可以轻松创建和编辑数学公式。AxMath支持多种数学符号、方程式、函数、矩阵等的输入和编辑&#xff0c;并提供了丰富的数学符号库和模板&#xff0c;方便用户快速创建复杂的数学公式。…

33_对bluecms v1.6进行代码审计、用代码审计三种方法分别进行实施、bluecms v1.6下载与安装、定向功能分析法

部署bluecms v1.6 靶场下载地址&#xff1a; https://wwtt.lanzn.com/b00uyckd9a 密码:2x71 访问 http://127.0.0.1/bluecms/install/ 数据库名称建议跟网站名一样 进入mysql-front查看&#xff0c;出现bluecms数据库&#xff0c;并且库中有很多表 然后访问前台&#xff1a;h…