C语言学习之字符函数和字符串函数
在C语言前面的内容中,我们学习到的库函数主要还是针对输入输出以及数字相关的内容,今天我们来学习一下有关于字符相关的函数,来对字符和字符串进行操作。
目录
字符分类函数
字符转换函数
strlen函数的使用和模拟实现
模拟实现
strcpy函数的使用和模拟实现
模拟实现
strcat函数的使用和模拟实现
模拟实现:
strcmp函数的使用和模拟实现
模拟实现:
strncpy函数的使用
strncat函数的使用
strncmp函数的使用
strstr函数的使用和模拟实现
模拟实现
strtok函数的使用
strerror函数
perrior函数
ASCII值字符表
一、标准ASCII字符表(0-127)
二、控制字符和转义字符表(0-31 和 127)
字符分类函数
C语言中有一系列自带的函数专门处理字符分类,即处理一个字符属于什么类型的。使用这些函数需要包含头文件<ctype.h>
以下就是<ctype.h>头文件中所有函数的函数名及其返回为真的条件
函数名 | 返回真值的条件(参数满足) |
---|---|
isalnum(int c) | c 是字母(a-z /A-Z )或数字(0-9 ) |
isalpha(int c) | c 是字母(a-z /A-Z ) |
iscntrl(int c) | c 是控制字符(ASCII 0-31 或 127) |
isdigit(int c) | c 是十进制数字(0-9 ) |
isgraph(int c) | c 是除空格外的可打印字符(ASCII 33-126) |
islower(int c) | c 是小写字母(a-z ) |
isprint(int c) | c 是可打印字符(包括空格,ASCII 32-126) |
ispunct(int c) | c 是标点符号(即非空格、非字母数字的可打印字符,如 !@#$%^&*() 等) |
isspace(int c) | c 是空白字符(空格 ' ' 、换行符 '\n' 、制表符 '\t' 、回车 '\r' 、垂直制表符 '\v' 、换页符 '\f' ) |
isupper(int c) | c 是大写字母(A-Z ) |
isxdigit(int c) | c 是十六进制数字(0-9 /a-f /A-F ) |
注意:
所有函数的参数 c
应为 unsigned char
类型或 EOF
(通常定义为 -1
)。
直接传递 char
类型可能导致符号扩展问题(如 char
为负值时行为未定义)。
使用的方法十分简单,如下:
int islower(int c);
练习:挑出一段字符中所有的数字:
#include<stdio.h>
#include<ctype.h>
int main()
{char ch[] = "ABCcdfe123###26 qwe21w";int i = 0;while (ch [i] != '\0'){if (isdigit(ch[i]) !=0){printf("%c ",ch[i]);}i++;}return 0;
}
练习:将一段字符中所有的大写字母转化为小写字母:
#include<stdio.h>
#include<ctype.h>
int main()
{char ch[] = "ABCcdfe123###26 qwe21w";int i = 0;while (ch[i] != '\0'){if (islower(ch[i]) != 0){ch[i] = ch[i] - 32;}printf("%c", ch[i]);i++;}return 0;
}
字符转换函数
C语言有两个字符转换函数
int tolower(int c)//将参数传入进去的大写字母转化为小写
int toupper(int c)//将参数传入进去的小写字母转化为大写
以下的函数到strtok函数使用均需要包含头文件<string.h>
strlen函数的使用和模拟实现
使用的基本语法:
size_t strlen(const char* str);
字符串以’\0‘为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括’\0‘)
但是参数str指向的字符串必须以'\0'为结束标识
注意函数的返回值为size_t,为无符号类型(注意!!!)
模拟实现
方案1(计数器):
int my_strlen(const char* str)
{int count = 0;assert(str!=NULL);while (*str){count++:str++;}return count;
}
方案2(递归):
int my_strlen(const char* str)
{assert(str);if (*str=='\0'){return 0;}else{return 1 + my_strlen(str + 1);}
}
方案3(指针—指针):
int my_strlen(const char* str)
{assert(str);char* p = str;while (*p != '\0'){p++;}return p - str;
}
strcpy函数的使用和模拟实现
strcpy函数是字符串拷贝函数。
在实际应用中如果我们要进行字符的赋值是不能这么做的
char st1[]="hello world";
char st2[] = "abcdfe";
st1[] = st2[];//这么写是绝对错误的
因为数组本质上是指针,是常量值,指针是不能改变的。
因此我们用strcpy函数来实现字符串的复制拷贝
基本语法如下:
char* strcpy(char *destination, const char *source);
其中destination为目标字符串,source为源头字符串
源字符串必须以’\0‘结束,并且会将源字符串的'\0'拷贝至目标空间
目标空间必须足够大,并且必须可以修改
模拟实现
主函数:
int main()
{char ch1 [] = "ABCDEFGHIKJHG";char ch2 [] = "hello world";my_strcpy(ch1, ch2);printf("%s\n", ch1);return 0;
}
方案1:
void my_strcpy(char *dest ,char *soc)
{char* ret = *soc;assert(dest!=NULL && soc!=NULL);while (*soc!='\0'){*dest = *soc;soc++;dest++;//可以简写为*dest++ = *soc++;}*dest = *soc;//拷贝'\0'
}
方案2:
char* my_strcpy(char *dest ,char *soc)
{char* ret = *soc;assert(dest!=NULL && soc!=NULL);while (*soc!='\0'){*dest = *soc;soc++;dest++;//可以简写为*dest++ = *soc++;}*dest = *soc;//拷贝'\0'return ret;//返回原字符串的地址
}
strcat函数的使用和模拟实现
strcat函数的作用就是将两个字符串函数拼接(追加)起来。
语法上与strcpy很类似:
char* strcat(char *destination, const char *source);
其中destination为目标字符串,source为源头字符串
源字符串和目标字符串都必须有’\0‘结束,如果目标字符串没有'\0'不知道从哪里开始
目标空间必须足够大,并且必须可以修改
应用举例:
int main()
{char ch1 [200] = "hello";char ch2 [] = " world";strcat(ch1, ch2);printf("%s\n", ch1);return 0;
}
模拟实现:
char* my_strcat(char* dest, const char* soc)
{assert(dest!=NULL && soc!=NULL);char* ret = dest;//找到*dest指向的'\0'while (*dest!='\0'){dest++;}//然后数据拷贝while (*dest++ = *soc++){;//空语句}return ret;//返回原字符串的地址
}
但是请注意,这么写运行不通过:
char* my_strcat(char* dest, const char* soc)
{assert(dest!=NULL && soc!=NULL);char* ret = dest;//找到*dest指向的'\0'while (*dest!='\0'){dest++;}//然后数据拷贝while (*dest++ = *soc++){;//空语句}return ret;//返回原字符串的地址
}
int main()
{char ch1 [200] = "hello";char ch2 [] = " world";my_strcat(ch1, ch1);printf("%s\n", ch1);return 0;
}
因为自己给自己追加会消除掉'\0',就会造成死循环,因此程序就会崩溃。
strcmp函数的使用和模拟实现
strcmp函数是用来比较字符串大小的函数。
比较标准:比较两个字符串中对应位置上字符ASCII码值的大小(一旦有一个字符比较出来了大小就停止不再进行下一个字符的比较大小,如果二者相等就继续比较下一个位置的字符)
如果第一个字符串大于第二个字符串,则返回一个大于0的数字
如果第一个字符串等于第二个字符串,则返回0
如果第一个字符串小于第二个字符串,则返回一个小于0的数字
对比辨析:
模拟实现:
int my_strcmp(const char* str1, const char* str2)
{int ret = 0;assert(str1!=NULL && str2!=NULL);while (*str1==*str2 ){if (*str1 == '\0'){return 0;}str1++;str2++;}return *str1 - *str2;
}
以上的三个字符函数是长度受限制的字符串函数,接下来我们要学习长度不受限制的字符串函数
strncpy函数的使用
strncpy函数语法如下:
char* strncpy(char *destination, const char *source,size_t num);
int main()
{char arr1[200] = "abcdfghijk";char arr2[20] = " ";strncpy(arr2, arr1,5);printf("%s\n",arr2);return 0;
}
当不够的时候,自动补齐“\0”。
strncat函数的使用
strncat函数的语法结构如下:
char* strncat(char *destination, const char *source,size_t num);
int main()
{char arr1[200] = "abcdfghijkxxxxxxxxxxxxxx";char arr2[20] = "xxx";strncat(arr2, arr1,5);printf("%s\n",arr2);return 0;
}
strncmp函数的使用
strcnmp函数的语法如下:
char* strncmp(char *destination, const char *source,size_t num);
strstr函数的使用和模拟实现
strstr函数主要是用于在一个字符串中找另外一个子字符串是否存在的函数。
strstr函数的语法类型:
char*strstr(const char*str1,char*str2)
如果找到了,返回起始地址;如果没找到返回NULL。
应用:str1中找str2第一次出现的位置,如果找到了返回起始位置的地址。
int main()
{char arr1[100] = "sgudusbvdugdabngfduedudhuidguadbefgbeudhidugauidufuegeuiw";char arr2[100] = "ab";const char *ret=strstr(arr1, arr2);if (ret == NULL){printf("找不到");}else{printf("%s\n",ret);}return 0;
}
模拟实现
方案1:
const char* my__strstr(const char* str1, const char* str2)
{const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;while (*cur){s1=cur;s2=str2;while (*s1 && *s2 && !(*s1 - *s2)){s1++;s2++;}if (!*s2){return cur;}cur++;}
}
方案2:
char* my_strstr(const char* str1, const char* str2)
{char* cp = (char*)str1;char* s1, * s2;if (!*str2){return (char*)str1;}while (*cp){s1 = cp;s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2)){s1++;s2++;}if (!*s2){return cp;}cp++;}return NULL;
}
strtok函数的使用
strtok函数是用来提取被分隔符分隔的字符串的函数。
如邮箱“loutianlizi@qq.com”
经过strtok函数后产生三段字符串“loutianlizi”,“qq”,“com”
strtok函数的语法形式为:
char*strtok(char*str,const char *sep);
sep参数指向一个字符串,定义了用作分隔符发字符集合
第一个参数指定一个字符串,它包含了0个或者多个sep参数中一个或者多个分隔符分隔的标记
strtok函数找到str中下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(注:strtok函数会改变该被操作的字符串,所以被strtok切割的字符串一般都是临时拷贝内容且可以修改)
strtok第一个参数不为NULL,函数将找到str第一个标记,strtok函数将它保存在字符串中的位置; strtok第一个参数为NULL,函数将在同意字符串中被保存的位置开始,查找下一个标记
如果不存在更多标记则返回NULL指针
int main()
{char arr[] = "hello world";char* sep = " . ";char* str = NULL;for (str==strtok(arr,sep);str!=NULL;str=strtok(NULL,sep)){printf("%s\n",str);}return 0;
}
strerror函数
strerror函数的语法如下:
char*strerror(int errnum);
strerror可以将参数部分错误码对应的错误信息的字符串地址返回回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量 errno 来记录程序的当前错误码,只不过程序启动的时候errno是 0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在 errno 中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
perrior函数
perroir函数功能同上,直接打印错误信息。打印完参数部分后,再打印“:”和空格,接着打印错误信息。
今天的内容就到这里了,谢谢各位读者朋友,求一个赞谢谢。
以下的内容仅供查询参考。
ASCII值字符表
一、标准ASCII字符表(0-127)
十进制 | 十六进制 | 字符/符号 | 描述 | |
---|---|---|---|---|
0-31 | 0x00-0x1F | 控制字符 | 不可打印,具体功能见下方表格 | |
32 | 0x20 | 空格(Space) | ||
33 | 0x21 | ! | 感叹号 | |
34 | 0x22 | " | 双引号 | |
35 | 0x23 | # | 井号 | |
36 | 0x24 | $ | 美元符号 | |
37 | 0x25 | % | 百分号 | |
38 | 0x26 | & | 与符号 | |
39 | 0x27 | ' | 单引号 | |
40 | 0x28 | ( | 左圆括号 | |
41 | 0x29 | ) | 右圆括号 | |
42 | 0x2A | * | 星号 | |
43 | 0x2B | + | 加号 | |
44 | 0x2C | , | 逗号 | |
45 | 0x2D | - | 减号/连字符 | |
46 | 0x2E | . | 句号 | |
47 | 0x2F | / | 斜杠 | |
48-57 | 0x30-0x39 | 0 -9 | 数字字符 | |
58 | 0x3A | : | 冒号 | |
59 | 0x3B | ; | 分号 | |
60 | 0x3C | < | 小于号 | |
61 | 0x3D | = | 等号 | |
62 | 0x3E | > | 大于号 | |
63 | 0x3F | ? | 问号 | |
64 | 0x40 | @ | at符号 | |
65-90 | 0x41-0x5A | A -Z | 大写字母 | |
91 | 0x5B | [ | 左方括号 | |
92 | 0x5C | \ | 反斜杠 | |
93 | 0x5D | ] | 右方括号 | |
94 | 0x5E | ^ | 脱字符 | |
95 | 0x5F | _ | 下划线 | |
96 | 0x60 | ``` | 反引号 | |
97-122 | 0x61-0x7A | a -z | 小写字母 | |
123 | 0x7B | { | 左花括号 | |
124 | 0x7C | ` | ` | 竖线 |
125 | 0x7D | } | 右花括号 | |
126 | 0x7E | ~ | 波浪号 | |
127 | 0x7F | DEL | 删除字符(不可打印) |
二、控制字符和转义字符表(0-31 和 127)
十进制 | 十六进制 | 转义序列 | 符号 | 功能 |
---|---|---|---|---|
0 | 0x00 | \0 | NUL | 空字符(字符串结束符) |
7 | 0x07 | \a | BEL | 响铃(终端提示音) |
8 | 0x08 | \b | BS | 退格(Backspace) |
9 | 0x09 | \t | HT | 水平制表符(Tab) |
10 | 0x0A | \n | LF | 换行(Line Feed) |
11 | 0x0B | \v | VT | 垂直制表符 |
12 | 0x0C | \f | FF | 换页符(Form Feed) |
13 | 0x0D | \r | CR | 回车(Carriage Return) |
27 | 0x1B | \e | ESC | 退出键(终端控制序列起始) |
127 | 0x7F | - | DEL | 删除字符(历史用途) |
相关文章:
C语言学习之字符函数和字符串函数
在C语言前面的内容中,我们学习到的库函数主要还是针对输入输出以及数字相关的内容,今天我们来学习一下有关于字符相关的函数,来对字符和字符串进行操作。 目录 字符分类函数 字符转换函数 以下的函数到strtok函数使用均需要包含头文件 st…...
自编码器(Autoencoder)
自编码器 是一种无监督学习的神经网络,主要用于数据的压缩和重构。它的核心思想是通过一个编码器将输入数据编码成一个低维表示(编码),然后再通过一个解码器将这个低维表示重构回原始数据。自编码器的目标是让重构后的数据尽可能…...
黄金分割法(0.618 法)
黄金分割法简介 黄金分割法属于区间缩小法,通过逐步缩小包含极值的区间长度,逼近极值点。在每一次迭代中,使用黄金分割点 0.618 将区间分为两部分,比较这两点处的函数值,舍弃较差区间,从而逐渐逼近最优解。…...
电商双11美妆数据分析实验总结
数据分析方法与应用 数据分类与绘图 数据分类方法:通过指定列名和函数(如SUM)来分类数据,确保数据集中包含所需列,否则会报错。 嵌套柱形图应用:嵌套柱形图用于展示多层次分类的数据,如按店名和…...
TB6600HG是一款PWM(脉宽调制)斩波型单芯片双极性正弦波微步进电机驱动集成电路。
该驱动器支持电机的正向和反向旋转控制,并具有多种激励模式,包括2相、1-2相、W1-2相、2W1-2相和4W1-2相。 使用这款驱动器,只需时钟信号即可驱动2相双极性步进电机,且振动小、效率高。 主要特点: 单芯片双极性正弦波…...
java每日精进 5.07【框架之数据权限】
数据权限,实现指定用户可以操作指定范围的数据。 数据权限不支持指定用户只能查看数据的某些字段; 权限可以分成三类:功能权限、数据权限、字段权限。 目前可以使用数据脱敏实现一定程度的字段权限控制; 1.数据权限实现步骤 1.1插…...
2:点云处理—3D相机开发
1.包含相机库目录 1.include D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\include 2.lib D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\lib\win 3.release D:\中科\Ainstec3DViewer\AinstecCamSDK\AinstecCamSDK_CPP\bin 4.示例程序 D:\中科\A…...
MySQL 中的 MVCC 是什么?
MySQL 中的 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种用于实现高并发读写操作的机制,它通过维护数据的多个版本来解决读写冲突,从而在保证事务隔离性的同时,减少锁的使用,…...
JC/T 2187-2013 铝波纹芯复合铝板检测
铝波纹芯复合铝板是指以铝波纹板为芯材,双面粘接铝板的复合板材,如下图所示,铝波纹芯复合板具有轻质,环保,吸音,隔热,防火等性能,被广泛应用于机场,医院,体育…...
数字乡村综合管理与服务平台软件需求规格说明文档
数字乡村综合管理与服务平台 软件需求规格文档 文件版本:1.3 版本 文件状态:修改完成 文件作者:7组全体成员 完成日期:2025年5月7日 文章目录 a. 引言a.1 目的a.2 文档约定a.3 预期读者与涉众分析a.4 产品的范围a.5 参考文献…...
Linux常用命令33——sudo授权普通用户执行管理员命令
在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,sudo命令来自英文词组super user do的缩写,中文译为“超级用户才能干的事”,其功能是授权普通用户执行管理员命令。使用su命令变更用户身份虽然好用ÿ…...
Redis--哈希类型
目录 一、Hash 哈希 1.2 常用命令 1.2.1 HSET 1.2.2 HGET 1.2.3 HEXISTS 1.2.4 HDEL 1.2.5 HKEYS 1.2.6 HVALS 1.2.7 HGETALL 1.2.8 HMGET 1.2.9 HLEN 1.2.10 HSETNX 1.2.11 HINCRBY 1.2.12 HINCRBYFLOAT 1.3 内部编码 一、Hash 哈希 几乎所有的主流编程语言都提…...
数据结构——排序(万字解说)初阶数据结构完
目录 1.排序 2.实现常见的排序算法 2.1 直接插入排序 编辑 2.2 希尔排序 2.3 直接选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 递归版本 2.6.1.1 hoare版本 2.6.1.2 挖坑法 2.6.1.3 lomuto前后指针 2.6.1.4 时间复杂度 2.6.2 非递归版本 2.7 归并排序…...
东方泵业,室外消火栓泵 2#故障灯亮,报警生响
东方泵业,室外消火栓泵 2#故障, 图纸上显示有一个热继电器,过热了,然后它不会自动复位,需要手动复位,手动点一下那个蓝色的按钮,然后警报就解除了...
vue3:十二、图形看板- 基础准备+首行列表项展示
文章主要实现了看板页面的搭建;将看板页面加入左侧菜单;首行列表项的实现 一、效果展示 展示四个数据列表,四个列表颜色各不相同,列表左侧有颜色边线(同标题颜色、图标颜色一致);展示的数字有一个从0到当前数据逐渐增长的一个动画效果 二、图形看板的准备工作 1、创建视…...
基于开源链动2+1模式AI智能名片S2B2C商城小程序的分销价格管控机制研究
摘要:本文聚焦开源链动21模式AI智能名片S2B2C商城小程序在分销体系中的价格管控机制,通过解析其技术架构与商业模式,揭示平台如何通过"去中心化裂变中心化管控"双轨机制实现价格统一。研究显示,该模式通过区块链存证技术…...
指定Docker镜像源,使用阿里云加速异常解决
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo异常贴图 yum-config-manager:找不到命令 因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-util…...
java基础-数组
1.数组的声明和初始化: (1)静态初始化: import java.util.Arrays;public class Main {public static void main(String[] args) {int[] ids {1,2,3,4,5};System.out.println(Arrays.toString(ids));} } (2…...
CSS手动布局
CSS支持单独设置某个元素的布局,最主要的属性是 position ,它有以下几个值: static静态位置(默认值)。元素采用正常流布局,此时元素的位置偏移属性( top 、 right 、 bottom 、 left 和 z-inde…...
什么是智能合约?区块链上的自动化契约
智能合约是运行在区块链上的计算机程序或交易协议。与传统的纸质合同不同,智能合约将合同条款直接编码到程序中,并在满足预设条件时自动执行。它们旨在实现无需第三方介入的可信交易,具有自动化、透明、不可篡改和高效等特点。 智能合约的起…...
webRtc之指定摄像头设备绿屏问题
摘要:最近发现,在使用navigator.mediaDevices.getUserMedia({ deviceId: ‘xxx’}),指定设备的时候,video播放总是绿屏,发现关闭浏览器硬件加速不会出现,但显然这不是一个最好的方案; 播放后张这样 修复后 上代码 指定…...
正则表达式非捕获分组?:
一个使用 Java 正则表达式的具体例子,展示了 (ab) 和 (?:ab) 的不同: 示例 1:使用 (ab)(捕获分组) import java.util.regex.*; public class RegexExample { public static void main(String[] args) { …...
Linux系统Shell脚本之shell数组、正则表达式、及AWK
目录 一.shell数组 1.数组分类 2.定义数组的方法 二.正则表达式 1. 元字符 2.表示次数 3.位置锚定 4.分组 5.扩展正则表达式 三.文本三剑客之AWK 1.awk 2.使用格式 3、处理动作 4.选项 5.处理模式 6.awk常见的内置变量 7.if条件判断 一.shell数组 1.数组分类 …...
在 ESP-IDF 中使用 .a 静态库调用
1. 准备静态库文件 将你的 .a 文件(如 libmylib.a)放置在工程目录中,推荐放在 components 子目录下: your_project/ ├── CMakeLists.txt ├── main/ └── components/└── my_lib/├── include/ # 头文件│ …...
大疆无人机“指点飞行模式”(TapFly)
在大疆无人机的功能中,“指点飞行模式”(TapFly)是一种通过点击屏幕目标点,让无人机自动规划路径并飞向指定位置的智能飞行模式。用户无需手动操控摇杆,只需在 App 地图或实时画面上点击目标位置&…...
力扣 : 781. 森林中的兔子
781. 森林中的兔子 - 力扣(LeetCode) 同一个数字的可以分为一组 , 3就是有3个人和我自己相同 也就是4个人,所以相同的数字可以分为 / (num1) 向上取整 class Solution { public:int numRabbits(vector<int>& answer…...
LVS中的DR模式,直接路由模式
DR模式工作原理介绍 请求经过调度器,响应由real server 直接响应给客户端。 如上图所示,real server想要正常访问互联网,后端的real server的网关就得写网络中真实的网关。 DR模式的核心要素:【重点】 1.请求经过调度器&…...
iTwin 数据报表(只是简单的原型不代表实现)
大概想法是 前端从schema和class中选中感兴趣的property内容生成ecsql语句传递给后端后端解析ecsql并提供公开接口给各个分析工具,如excel,poewerBI等(Odata或者直接选择来自网站)再由分析工具做进一步的处 还未想好的点 如何存…...
【无标题】如何在sheel中运行Spark
启动hdfs集群,打开hadoop100:9870,在wcinput目录下上传一个包含很多个单词的文本文件。 启动之后在spark-shell中写代码。 // 读取文件,得到RDD val rdd1 sc.textFile("hdfs://hadoop100:8020/wcinput/words.txt") // 将单词进行…...
Spark 处理过程转换:算子与行动算子详解
在大数据处理领域,Apache Spark 凭借其强大的分布式计算能力脱颖而出,成为处理海量数据的利器。而 Spark 的核心处理过程,主要通过转换算子和行动算子来实现。本文将深入探讨 Spark 中的转换算子和行动算子,帮助读者更好地理解和应…...
Docker编排工具---Compose的概述及使用
目录 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看访问日志 3、输出绑定的公共端口 4、重新构建服务 5、启动服务 6、停止服务 7、删除已停止服务的容器 8、创建和启动容器 9、在运行的容器中执行命令 10、指定一个服务启动容器的个数 11、其…...
Matlab实现绘制任意自由曲线
Matlab实现绘制任意自由曲线,实现Photoshop中的钢笔路径功能,用光顺连接的B样条/贝塞尔曲线实现,鼠标点击生成控制点,拖动形成任意曲线。 可描绘多路径,也可旋转、平移、缩放。经调试可用。 ByangtiaoSculpt/Byangti…...
如何保证Kafka生产者的消息顺序性? (单分区内有序,需确保同一Key的消息发送到同一分区)
Kafka 生产者消息顺序性保障方案 1. 核心实现原理 消息顺序性保障公式: 同一 Key → 同一 Partition → 严格顺序写入2. 关键配置参数 Properties props new Properties(); props.put("acks", "all"); // 确保消息持久化 props.put("ma…...
[D1,2] 贪心刷题
文章目录 摆动序列最大子数组合买卖股票跳跃游戏跳跃2 摆动序列 不像是贪心,只要抓住摆动这个点,前一个上升,那下一个就要下降,记录上一次的状态为1的话,那下一次就要更新为-1,如果上一次为1,这…...
springboot使用阿里云OSS实现文件上传
在Spring Boot中集成阿里云OSS(对象存储服务)可以通过以下步骤实现: 添加Maven依赖 在pom.xml中添加阿里云OSS SDK依赖: <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss<…...
nginx之proxy_redirect应用
一、功能说明 proxy_redirect 是 Nginx 反向代理中用于修改后端返回的响应头中 Location 和 Refresh 字段的核心指令,主要解决以下问题:协议/地址透传错误:当后端返回的 Location 包含内部 IP、HTTP 协议或非标准端口时,需修正为…...
FAISS(Facebook AI Similarity Search)
First steps with Faiss for k-nearest neighbor search in large search spaces - Davide’s GitHub pages FAISS(Facebook AI Similarity Search)是由Meta(原Facebook)AI团队开发的高效相似性搜索库,主要用于处理大规…...
创建虚拟服务时实现持久连接。
在调度器中配置虚拟服务,实现持久性连接,解决会话保持问题。 -p 【timeout】 -p 300 这5分钟之内调度器会把来自同一个客户端的请求转发到同一个后端服务器。【不管使用的调度算法是什么。】【称为持久性连接。】 作用:将客户端一段时间…...
RabbitMQ中Exchange交换器的类型
在RabbitMQ中,Exchange(交换器)是消息路由的核心组件,它接收生产者发送的消息,并根据不同的规则将消息转发到一个或多个队列。 RabbitMQ主要支持以下几种类型的交换器: 1. Direct Exchange(直连…...
JavaSE核心知识点01基础语法01-05(字符串)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点01基础语法01-05࿰…...
Vue 项目中二维码生成功能全解析
Vue 项目中二维码生成功能全解析 在信息快速传递的时代,二维码以其简洁高效的特点,成为数据交互的重要媒介。无论是用于支付、信息分享,还是活动参与,二维码都扮演着关键角色。在 Vue 项目开发中,如何实现二维码生成功…...
【AWS+Wordpress】将本地 WordPress 网站部署到AWS
前言 自学笔记,解决问题为主,亲测有效,欢迎补充。 本地开发机:macOS(Sequoia 15.0.1) 服务器:AWS EC2(Amazon Linux 2023) 目标:从本地迁移 WordPress 到云…...
性能优化-初识(C++)
性能优化-初识 一、内联与优化(Inlining and Optimization)什么是内联(inline)?使用方式:适用场景:注意事项: 二、缓存友好设计(Cache-Friendly Design)原理简…...
[人机交互]交互设计过程
*一.设计 1.1什么是设计 设计是一项创新活动,旨在为用户提供可用的产品 –交互设计是“设计交互式产品、以支持人们的生活和工作” 1.2设计包含的四个活动 – 识别用户的需要( needs )并建立需求( requirements ) …...
密码学基石:哈希、对称/非对称加密与HTTPS实践详解
密码学是现代信息安全的基石,它提供了一系列强大的数学工具和技术,用于保护数据的机密性、完整性和真实性,并确保通信双方的身份可被认证。在纷繁复杂的网络世界中,无论是安全的网页浏览 (HTTPS)、安全的软件更新、还是用户密码的…...
WebRTC通信原理与流程
1、服务器与协议相关 1.1 STUN服务器 图1.1.1 STUN服务器在通信中的位置图 1.1.1 STUN服务简介 STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重 NAT)…...
ChromaDB调用BGE模型的两种实践方式
ChromaDB调用BGE模型 前言1.chromadb调用BGE模型api2.调用本地模型 前言 在语义搜索、知识库构建等场景中,文本向量化(Embedding)是核心技术环节。作为一款开源的向量数据库,ChromaDB允许开发者通过自定义嵌入函数灵活对接各类模…...
解构与重构:自动化测试框架的进阶认知之旅
目录 一、自动化测试的介绍 (一)自动化测试的起源与发展 (二)自动化测试的定义与目标 (三)自动化测试的适用场景 二、什么是自动化测试框架 (一)自动化测试框架的定义 &#x…...
如何巧妙解决 Too many connections 报错?
1. 背景 在日常的 MySQL 运维中,难免会出现参数设置不合理,导致 MySQL 在使用过程中出现各种各样的问题。 今天,我们就来讲解一下 MySQL 运维中一种常见的问题:最大连接数设置不合理,一旦到了业务高峰期就会出现连接…...
【卡特兰数】不同的二叉搜索树
文章目录 96. 不同的二叉搜索树解法一:动态规划状态表示状态转移方程初始化遍历顺序返回值💥解法二:卡特兰数96. 不同的二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉…...