【C语言】字符函数,字符串函数,内存函数
大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。
目录
1. 字符函数
1.1 字符分类函数
1.2 字符转换函数
1.2.1 tolower(将大写字母转化为小写字母)
1.2.2 toupper(将小写字母转化为大写字母)
2. 字符串函数
2.1 字符串输入函数
2.1.1 gets()
2.1.2 fgets()
2.2 字符串输出函数 puts()
2.3 字符串求长度函数 strlen
2.4 长度不受限制的字符串函数
2.4.1 字符串复制函数 strcpy
2.4.2 字符串连接函数 strcat
2.4.3 字符串比较函数 strcmp
2.5 长度受限制的字符串函数
2.5.1 strncpy
2.5.2 strncat
2.5.3 strncmp
2.6 字符串查找函数 strstr
2.7 字符串分割函数 strtok
2.8 错误处理函数 strerror
3. 内存函数
3.1 memcpy
3.2 memmove
3.3 memset
3.4 memcmp
3. 总结
1. 字符函数
1.1 字符分类函数
字符分类函数的头文件为ctype.h
具体用法可以看这个:https://legacy.cplusplus.com/reference/cctype/
1.2 字符转换函数
字符转换函数的头文件也为ctype.h
1.2.1 tolower(将大写字母转化为小写字母)
函数原型:
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>int main() {char ch = 'B';char new_ch = tolower(ch);printf("%c", new_ch);return 0;
}
1.2.2 toupper(将小写字母转化为大写字母)
函数原型:
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<ctype.h>int main() {char ch = 'b';char new_ch = toupper(ch);printf("%c", new_ch);return 0;
}
2. 字符串函数
字符串输入函数和字符串输出函数的头文件均为stdio.h
其它的字符串函数头文件一般为string.h
2.1 字符串输入函数
2.1.1 gets()
函数原型:
gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。有时候,从键盘输入的内容,或者将要输出到显示器上的内容,会暂时进入缓冲区,待时机成熟,再一股脑将缓冲区中的所有内容“倒出”,我们才能看到变量的值被刷新,或者屏幕产生变化。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main() {char str[30];gets(str);puts(str);return 0;
}
但是这个函数在C或C++不可再用(自C11和C++14起),因为不安全
(不过在实际做题中,我发现有些oj上还是能用的~)
2.1.2 fgets()
因为前面说了gets()函数不安全,在新版C++已经不可再用,所以fgets()用来替代gets()。
但注意fgets()不会删除行末的回车字符
fgets()函数是C语言中的一个输入函数,用于从标准输入(例如键盘)读取一行字符串。
函数原型:
fgets()的作用是读取一行字符并存储到指定的字符串缓冲区中,直到读取到换行符或者达到指定的最大字符数(包括换行符)为止。
其中,str是指向存储读取字符串的缓冲区的指针,num是缓冲区的大小,stream是要读取的文件流(通常使用stdin表示标准输入)。
fgets函数返回指向存储读取字符串的缓冲区的指针,如果读取成功,则返回值与str相同,如果出现错误或者到达文件末尾,则返回NULL。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main() {char str[30];fgets(str,30,stdin);puts(str);return 0;
}
2.2 字符串输出函数 puts()
函数原型:
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main() {char str[30] = "hello world";puts(str);return 0;
}
2.3 字符串求长度函数 strlen
函数原型:
注意事项:
1. 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
含 '\0' )。
2. 参数指向的字符串必须要以 '\0' 结束。
3. 注意函数的返回值为size_t,是无符号的。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main() {char str[30] = "abcdef";printf("%d\n", strlen(str));return 0;
}
strlen的模拟实现
size_t my_strlen(const char* str)
{assert(str);int cnt = 0;while (*str!='\0'){cnt++;str++;}return cnt;
}
2.4 长度不受限制的字符串函数
2.4.1 字符串复制函数 strcpy
函数原型:
注意事项:
1. 源字符串必须以 '\0' 结束。
2. 会将源字符串中的 '\0' 拷贝到目标空间。
3. 目标空间必须足够大,以确保能存放源字符串。
4. 目标空间必须可变。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = { 0 };char str2[30] = "abcdef";strcpy(str1, str2);printf("%s\n",str1);return 0;
}
strcpy的模拟实现
char* my_strcpy(char *dest,const char *src)
{assert(dest && src);char* ret = dest;while (*dest++=*src++){;}return ret;
}
2.4.2 字符串连接函数 strcat
函数原型:
注意事项:
1. 源字符串必须以 '\0' 结束。
2. 目标空间必须有足够的大,能容纳下源字符串的内容。
3. 目标空间必须可修改。
4. 字符串不能自己追加自己
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "hello ";char str2[30] = "world";printf("%s\n",strcat(str1,str2));return 0;
}
strcat的模拟实现
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while (*dest!='\0')dest++;while (*dest++ = *src++){;}return ret;
}
2.4.3 字符串比较函数 strcmp
函数原型:
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字。
第一个字符串等于第二个字符串,则返回0。
第一个字符串小于第二个字符串,则返回小于0的数字。
我们结合下图就能很直观理解上面的标准规定~
用法示例:
情况一:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "above";char str2[30] = "about";printf("%d\n",strcmp(str1,str2));return 0;
}
情况二:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "About";char str2[30] = "about";printf("%d\n",strcmp(str1,str2));return 0;
}
情况三:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "about";char str2[30] = "about";printf("%d\n",strcmp(str1,str2));return 0;
}
strcmp的模拟实现
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2) return 1;else return -1;
}
2.5 长度受限制的字符串函数
2.5.1 strncpy
函数原型:
注意事项:
1. 拷贝num个字符从源字符串到目标空间。
2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "abcdef";char str2[30] = "xxxxxxxxxxxxxx";strncpy(str1, str2, 4);printf("%s\n", str1);return 0;
}
2.5.2 strncat
函数原型:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "hello ";char str2[30] = "worldxxxxxx";strncat(str1, str2, 5);printf("%s\n", str1);return 0;
}
2.5.3 strncmp
函数原型:
逐个比较两个字符串字符的ASCII码值,直到出现不一样的字符或者一个字符串结束或者num个字符全部比较完。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "abc";char str2[30] = "abcdef";char str3[30] = "aba";printf("%d\n", strncmp(str1, str2, 3));printf("%d\n", strncmp(str1, str2, 4));printf("%d\n", strncmp(str1, str3, 5));return 0;
}
2.6 字符串查找函数 strstr
函数原型:
strstr函数的作用是在字符串str1中查找是否含有字符串str2的子串,如果存在,返回str2在str1中第一次出现的地址;否则返回空指针NULL。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str1[30] = "abcdef";char str2[30] = "abc";if (strstr(str1, str2))printf("找到了\n");elseprintf("找不到\n");return 0;
}
strstr的模拟实现
char* my_strstr(char* str1, char* str2)
{assert(str1 && str2);char* cp = str1;char* s1 = cp;char* s2 = str2;if (str2 == '\0')return str1;while (*cp){s1 = cp;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return cp;cp++;}return NULL;
}
2.7 字符串分割函数 strtok
strtok函数的作用是将一个字符串按照指定的分隔符进行分割,并返回分割后的子字符串。
函数原型:
注意事项:
1. sep参数是个字符串,定义了用作分隔符的字符集合。
2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3. strtok函数找到str中的下一个标记,并将其用' \0' 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
6. 如果字符串中不存在更多的标记,则返回NULL 指针。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main() {char str[] = "Hello, world! How are you today?";char delim[] = " ,!?"; // 分隔符包括空格、逗号和感叹号// 使用第一次调用strtok函数char* token = strtok(str, delim);// 循环调用strtok函数以获取每个子字符串while (token != NULL) {printf("%s\n", token);token = strtok(NULL, delim);}return 0;
}
以上代码将输入字符串"Hello, world! How are you today?"按照空格、逗号和感叹号作为分隔符,将其分割成多个子字符串,并依次打印每个子字符串。输出结果如下:
注意:在整个循环过程中,使用NULL作为第一个参数,以便继续分割原字符串。这样可以依次获取每个子字符串。
2.8 错误处理函数 strerror
strerror的作用是根据给定的错误代码返回相应的错误描述字符串。
具体而言,strerror函数接受一个整数参数errno作为输入,该参数代表了一个错误代码。函数会根据给定的错误代码查找对应的错误描述字符串,并将其返回。
函数原型:
用法示例:
示例一:
下面代码是将错误码0~9所对应的错误信息给打印出来:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>int main()
{int i = 0;for (int i = 0; i < 10; i++){printf("%d:%s\n", i, strerror(i));}return 0;
}
示例二:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <errno.h>int main() {FILE* file = fopen("nonexistent.file", "r");if (file == NULL) {int error_code = errno;const char* error_msg = strerror(error_code);printf("Failed to open file: %s\n", error_msg);}else {// 文件打开成功,继续其他操作// ...fclose(file);}return 0;
}
以上代码尝试打开一个名为"nonexistent.file"的文件,如果文件打开失败,则获取对应的错误代码,并使用strerror函数获取错误描述字符串,最后将错误描述字符串打印出来。输出结果类似于:
需要注意的是,strerror函数返回的错误描述字符串可能是静态分配的,多次调用strerror函数可能会覆盖之前的结果。因此,建议尽量将结果保存在变量中,而不是直接在printf等函数中使用strerror函数。
3. 内存函数
内存函数的头文件一般也为string.h
3.1 memcpy
memcpy函数作用是将指定长度的内存块从源地址复制到目标地址。
也就是说,memcpy函数用来处理不重叠的内存拷贝。
函数原型:
注意事项:
1. 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2. 这个函数在遇到 '\0' 的时候并不会停下来。
3. 如果source和destination有任何的重叠,复制的结果都是未定义的。
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>int main() {int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] = { 0 };//将arr1中的内容,拷贝到arr2中memcpy(arr2, arr1, 40);for (int i = 0; i < 20; i++)printf("%d ", arr2[i]);return 0;
}
memcpy的模拟实现
void* my_memcpy(void* dest, const void* src, size_t num) //num单位是字节
{void* ret = dest;assert(src && dest);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
3.2 memmove
memmove函数作用是将指定长度的内存块从源地址移动到目标地址,允许源和目标内存块重叠。
也就是说,memmove函数用来处理重叠内存拷贝。
函数原型:
用法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++)printf("%d ", arr1[i]);return 0;
}
memmove的模拟实现:
void* my_memmove(void* dest, const void* src, size_t num) //num单位是字节
{void* ret = dest;assert(dest && src);if (dest < src) //前->后拷贝{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else //后->前拷贝{while (num--){*((char*)dest+num) = *((char*)src+num);}}return ret;
}
3.3 memset
memset函数作用是将指定长度的内存块填充为指定的值。
函数原型:
用法示例:
示例一:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main()
{int arr[5];memset(arr, 0, sizeof(arr));for (int i = 0; i < 5; i++)printf("%d ", arr[i]);return 0;
}
数组arr的所有元素都将被设置为0。
示例二:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main(){char arr[] = "hello world";memset(arr + 1, 'x', 4); //以字节为单位设置的printf("%s\n", arr);return 0;
}
3.4 memcmp
memcmp的作用是比较两个内存块的内容。
函数原型:
注意事项:
比较从ptr1和ptr2指针开始的num个字节
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>int main(){int arr1[] = { 1,2,1,4,5,6 };int arr2[] = { 1,2,257 };int ret = memcmp(arr1, arr2, 10);printf("%d\n", ret);return 0;
}
3. 总结
到这里,我们就介绍完了C语言中的字符函数,字符串函数和内存函数。有什么问题欢迎在评论区讨论。如果觉得文章有什么不足之处,可以在评论区留言。如果喜欢我的文章,可以点赞收藏哦!
相关文章:

【C语言】字符函数,字符串函数,内存函数
大家好!今天我们来学习C语言中的字符函数,字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower(将大写字母转化为小写字母) 1.2.2 toupper(将小写字母转化为大写字母&…...

Spring MVC:域对象共享数据
Spring MVC 前言域对象共享数据使用 ModelAndView 向 request 域对象中共享数据使用 Map 、Model 或 ModelMap 向 request 域对象中共享数据使用 SesionAttributes 注解向 session 域对象中共享数据使用 Servlet API 向 application 域对象中共享数据 附 前言 在上一章中&…...

Vue框架--Vue中的计算属性
下面,我们来实现一个这样的需求。 实现输入框1和输入框2中文字内容的拼接。...
面试题-React(八):React如何实现插槽?
一、React插槽的概念 插槽是一种让组件变得更加灵活和可复用的技术。它允许我们在组件内部预留一些位置,然后在组件使用时填充这些位置,实现外部内容的嵌套。 二、实现React插槽的方法 在React中,实现插槽可以通过两种方式:pro…...

【前端demo】动态赋值CSS
文章目录 效果过程html实现oninput与onchange事件统一配置CSS 代码HTMLCSSJS 其他demo 效果 动态显示CSS样式,由:root统一配置。 效果预览:https://codepen.io/karshey/pen/BavLrwy 参考: Dynamic CSS Variables(codepen.io) 漫谈document…...

BlockUI专栏目录
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C-CSDN博客 简介: BlockUI是一个设计NX对话框的工具,是官方推荐使用的对话框制作方法,能够与NX自身风格相统一,并且在实际…...
K8S获取连接token
1、创建一个具有管理员权限的账户 下载或拷贝文件到主机上,vi k8s-admin.yml --- apiVersion: v1 kind: ServiceAccount metadata:name: dashboard-adminnamespace: kube-system --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 met…...

CountDownLatch原理-(主线程等待子线程结束再执行)
CountDownLatch是共享锁的一种实现,它默认构造 AQS 的 state 值为 count。当线程使用countDown方法时,其实使用了tryReleaseShared方法以CAS的操作来减少state,直至state为0就代表所有的线程都调用了countDown方法。当调用await方法的时候,如果state不为0࿰…...

mybatis源码学习-3-解析器模块
写在前面,这里会有很多借鉴的内容,有以下三个原因 本博客只是作为本人学习记录并用以分享,并不是专业的技术型博客笔者是位刚刚开始尝试阅读源码的人,对源码的阅读流程乃至整体架构并不熟悉,观看他人博客可以帮助我快速入门如果只是笔者自己观看,难免会有很多弄不懂乃至理解错误…...

解决微信小程序recycle-view使用百分比单位控制宽高时出现的内容溢出问题
recycle-view是微信小程序官方推出的一个经过优化的长列表组件,但是在使用百分比单位控制高宽时有个内容溢出问题,虽然它提供了height和width的参数可以设置宽高,但每次写列表都需要去js里获取宽高并设置是较为麻烦的,所以现在来着…...

如何使用蚂蚁集团自动化混沌工程 ChaosMeta 做 OceanBase 攻防演练?
当前,业界主流的混沌工程项目基本只关注如何制造故障的问题,而经常做演练相关工作的工程师应该明白,每次演练时还会遇到以下痛点: 检测当前环境是否符合演练预设条件(演练准入); 业务流量是否满…...
在 Node.js 中使用 MongoDB 事务
MongoDB事务 事务介绍 在 MongoDB 中,对单个文档的操作是原子的。由于您可以使用嵌入的文档和数组来捕获单个文档结构中的数据之间的关系,而不是跨多个文档和集合进行规范化,因此这种单一文档的原子性消除了对多文档的需求许多实际用例的事务…...

IntelliJ IDEA的远程开发(Remote Development)
DEA的远程开发功能,可以将本地的编译、构建、调试、运行等工作都放在远程服务器上执行,而本地仅运行客户端软件进行常规的开发操作即可,官方给出的逻辑图如下,可见通过本地的IDE和服务器上的IDE backend将本地电脑和服务器打通&am…...
网络安全-信息收集简介
本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 什么是信息收集 信息收集是指通过各种方式获取所需要的信息,以便我们在后续的渗透过程更好的…...

页面页脚部分CSS分享
先看效果: CSS部分:(查看更多) <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…...

微信小程序slot插槽的介绍,以及如何通过uniapp使用动态插槽
微信小程序文档 - slots介绍 由上述文档看俩来,微信小程序官方并没有提及动态插槽内容。 uniapp文档 - slots介绍 uni官方也未提及关于动态插槽的内容 在实际使用中,直接通过 <<slot :name"item.xxx" /> 这种形式会报错ÿ…...

l8-d6 socket套接字及TCP的实现框架
一、socket套接字 /*创建套接字*/ int socket(int domain, int type, int protocol); /*绑定通信结构体*/ int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); /*监听套接字*/ int listen(int sockfd, int backlog); /*处理客户端发起的连接࿰…...

ChatGPT AIGC 完成动态堆积面积图实例
先使用ChatGPT AIGC描述一下堆积面积图的功能与作用。 接下来一起看一下ChatGPT做出的动态可视化效果图: 这样的动态图案例代码使用ChatGPT AIGC完成。 将完整代码复制如下: <!DOCTYPE html> <html> <head><meta charset="utf-8"><tit…...

虹科产线实时数采检测方案——高速采集助力智能化升级
01 产线数采检测相关技术背景 1.1 典型场景 对于产线数采检测,让我们从典型的工厂场景开始介绍。 每个工位都有上位机监控下方的PLC控制器。指令、执行单元和作用对象的状态通过内置传感器进行采集和测量,反馈给PLC实现闭环控制。 工业4.0和智能制…...

用迅为RK3568开发板使用OpenCV处理图像颜色通道提取ROI
本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\07”目录下,如下图所示: 在计算机的色彩图像中存有三个通道,即 BGR 通道,根据三个颜色通道的亮度值来显示出不同的颜色&…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...