C++蓝桥杯基础篇(七)
片头
嗨~小伙伴们,大家好!今天我们来一起学习蓝桥杯基础篇(七),学习相关字符串的知识,准备好了吗?咱们开始咯!

一、字符与整数的联系——ASCII码
每个常用字符都对应一个-128~127的数字,二者之间可以相互转化:
int main() {char c = 'a';cout << (int)c << endl;int a = 66;cout << (char)a << endl;return 0;
}
打印结果为:
97
B
常用的ASCII值:'A'~'Z'是65~90,'a'~'z'是97~122,'0'~'9'是48~57,字符可以参与运算,运算时会将其当做整数:
// 字符可以参与运算,运算时会将其当做整数
int main() {int a = 'B' - 'A';int b = 'A' * 'B';char c = 'A' + 2;cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}
运行结果为:
1
4290
C
练习:输入一行字符,统计出其中数字字符的个数,以及字母字符的个数
//练习: 输入一行字符,统计出其中数字字符的个数,以及字母字符的个数
int main() {char c;int num = 0; //数字字符的个数int chars = 0; //字母字符的个数while (cin >> c) {if (c >= '0' && c <= '9') num++;else if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') chars++;}cout << "数字字符的个数为: " << num << endl;cout << "字母字符的个数为: " << chars << endl;return 0;
}
二、字符数组
字符串就是字符数组加上结束符'\0'。
可以使用字符串来初始化字符数组,但是要注意,每个字符串结尾会暗含一个'\0'字符,因此字符数组的长度至少要比字符串的长度多1!
int main() {char a1[] = { 'C','+','+' }; //没有'\0'char a2[] = { 'C','+','+','\0' }; //有'\0'char a3[] = "C++"; //自动添加表示字符串结尾的空字符'\0'//char a4[6] = "Daniel";//没有位置存放'\0',报错char a4[7] = "Daniel"; //正确写法cout << sizeof a1 << endl; //3cout << sizeof a2 << endl; //4cout << sizeof a3 << endl; //4return 0;
}
如果我们想访问从字符数组的第2个位置开始,或者从中间位置开始,那么我们可以这样:
int main() {char a2[] = { 'A','B','C','D','\0' };char a3[] = "ABCDEF";cout << a2 + 1 << endl; //BCDprintf("%s\n", a3 + 2); //CDEFreturn 0;
}
2.1 字符数组的输入输出
// 2.1 字符数组的输入输出int main() {char str[100];char s[100];scanf("%s", s); //这里不能加&,数组名代表首元素的地址cin >> str; //输入字符串时,遇到空格或者回车就会停止cout << str << endl; //输出字符串时,遇到空格或者回车不会停止printf("%s\n", str);return 0;
}
读入一行字符串,包括空格
//读入一行字符串,包括空格
int main8() {char str[100];gets(str); cout << str << endl;return 0;
}
虽然用 gets() 时有空格也可以直接输入,但是 gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据。
换句话说,如果输入的字符数目大于数组的长度,gets 无法检测到这个问题,就会发生内存越界,所以编程时建议使用 fgets()。
fgets()函数原型为:
char *fgets(char *s, int size, FILE *stream);
从stream流中读取size个字符存储到字符指针变量s所指向的内存空间
返回值为一个指针,指向字符串中第一个字符的地址
1. s:代表要保存到内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名
2. size:代表的是读取字符串的长度
3. stream:表示从何种流中读取,可以是标准输入流stdin,也可以是文件流
因此,我们可以使用fgets()来帮助我们读取字符串
int main() {char str[100];//从输入流stdin中最多读取100个字符到字符数组str中。//除去末尾的字符串结束符,实际上最多读取99个字符//fgets函数可以读取到空格和'\n'fgets(str, 100, stdin);cout << str << endl;return 0;
}
我们还可以使用cin来读取string类型的字符串,cin输入接触到第一个非空格字符时开始阅读,当遇到下一个字符(空格、制表符、换行符)时,就会停止读取
int main() {string s;printf("输入:\n");cin >> s;printf("输出:\n");cout << s;return 0;
}
为了避免cin对于空白符的忽略问题,我们可以使用getline函数,getline函数可以读取整行,包括前面和中间的空格,并将其存储在字符串对象中,在输入时,直至遇到'\n'或EOF,才终止一行字符串的输入操作。
getline()函数有4种重载形式,这里我们先介绍1种,后续慢慢讲解
istream& getline(istream& is, string& str);
读取的istream是作为参数 is 传进函数的,读取的字符串保存在string类型的str中。
is : 表示一个输入流,例如cin。
str : 为string类型的引用,用来存储输入流中的流信息。
因此,我们可以使用getline()函数来读取字符串
int main() {string s;getline(cin, s);cout << s << endl;return 0;
}
2.2 字符数组的常用操作
下面几个函数需要引入头文件 #include<string.h>
(1)strlen(str),求字符串的长度
(2)strcmp(a,b),比较2个字符串的大小,a<b返回-1,a==b返回0,a>b返回1。这里的比较方式就是字典序!
(3)strcpy(a,b),将字符串b复制给从a开始的字符数组
下面我们依次来介绍这些函数
①strlen(str),求字符串的长度
// (1)strlen(str),求字符串的长度
int main() {char a[100] = "hello world!";cout << strlen(a) << endl; // 12return 0;
}
②strcmp(a,b),比较2个字符串的大小
// (2)strcmp(a,b),比较2个字符串的大小,
// a<b时,返回-1;a==b时,返回0;a>b时,返回1int main() {char s1[100], s2[100];scanf("%s%s", s1, s2); //scanf函数的%s,会自动忽略空格,换行,Tab键cout << strcmp(s1, s2) << endl;return 0;
}
或者
int main() {char s1[100];scanf("%s", s1);cout << strcmp(s1, "abc") << endl;//将s1字符数组里面的内容和"abc"进行比较return 0;
}
③strcpy(a,b),将字符串b复制给从a开始的字符数组
// (3)strcpy(a,b),将字符串b复制给从a开始的字符数组
int main() {char s1[100], s2[100];scanf("%s", s1);strcpy(s2, s1);cout << s2 << endl;return 0;
}
2.3 遍历字符数组中的字符
遍历数组,当然采用for循环了,while循环也可以
//2.3 遍历字符数组中的字符int main() {char a[100] = "hello world!";for (int i = 0; i < strlen(a); i++) {cout << a[i] << endl;}return 0;
}
这种方法行是行,但是每次都要计算strlen(a),花费了很多时间,有没有更省时的方法?
肯定有!把strlen(a)的结果存放在临时变量里面不就可以了~
int main() {char s1[100];scanf("%s", s1);for (int i = 0, len = strlen(s1); i < len; i++) //将strlen(s1)的结果保存到len中{cout << s1[i] << endl;}return 0;
}
当然了,我们还可以在外面写:
int main() {char s1[100];scanf("%s", s1);int len = strlen(s1);for (int i = 0; i < len; i++) {cout << s1[i] << endl;}return 0;
}
练习1:只出现1次的字符
给定一个只包含小写字母的字符串,请你找出第一个仅出现一次的字符。如果没有,输出"no"。

思路:
①我们可以先定义str数组,用来读取输入的字符串,str数组长度可能会很大很大,所以定义为全局变量。
②再定义num数组,用来统计每个字母出现的次数,字母总数26个,因此,num数组长度为26。下标从0~25.,下标为0表示'a'出现的次数,下标为1表示'b'出现的次数....(相当于num数组是26个字母的映射)
③如何统计每个字母出现的次数呢?很简单,’a'的ASCII码值为97,对应num数组下标为0的位置,'a'出现的次数 = num数组下标为0位置的值;每当'a'出现1次,num[0]++;所以,表达式应为 num[str[i]-'a']
④当num数组出现任一下标的值为1的情况,即num[str[i]-'a'] == 1时,就是仅出现一次的字符。我们只需输出这个字符即可,即str[i],并且终止循环。
⑤如果num数组没有上面④这种情况,输出"no"
本道题代码如下:
//练习1:给定一个只包含小写字母的字符串,
//请找出第一个仅出现1次的字符。
//如果没有,输出"no"int num[26] = { 0 };
char str[10010];int main() {cin >> str;int len = strlen(str);for (int i = 0; i < len; i++) {num[str[i] - 'a']++;}for (int i = 0; i < len; i++) {if (num[str[i] - 'a'] == 1) {cout << str[i] << endl;return 0; //直接main函数结束,无需执行后续代码}}cout<<"no"<<endl;//如果没找到,输出"no"return 0;
}
第二个for循环也可以这样写:
for (int j = 0; j < 26; j++) {if (num[j] == 1) //如果num数组对应下标位置的值为1{cout << char(j + 'a') << endl;//输出该字符,强转成char类型return 0;}}
练习2:替换字符
把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串

这道题,比较简单。代码如下:
//练习2:把一个字符串中特定的字符全部用给定的字符替换
//得到一个新的字符串int main() {char str[31] = { 0 };scanf("%s", str); //scanf函数的%s,会自动忽略空格,换行,Tab键char c;scanf("\n%c", &c); //scanf函数的%c,任何数据都会被当作一个字符//不管是数字还是空格、回车、Tab键它都会取回for (int i = 0; str[i]; i++) {if (str[i] == c) {str[i] = '#';}}puts(str);return 0;
}
也可以使用下面这种方法:
int main() {char str[31] = { 0 };cin >> str; //用cin也可以int len = strlen(str);//strlen函数的参数类型是char*char c;cin >> c;for (int i = 0; i < len; i++) {if (str[i] == c) {str[i] = '#';}}cout << str << endl; //使用cout也可以return 0;
}
三、标准库类型 string
可变长的字符序列,比字符数组更加好用,需要引入头文件:#include<string>
3.1 定义和初始化
//3.1 定义和初始化
int main() {string s1; //默认初始化,s1是一个空字符串string s2 = s1; //s2是s1的副本string s3 = "hiya"; //s3是该字符串字面值的副本string s4(10, 'c'); //s4的内容是 ccccccccccreturn 0;
}
3.2 string上的操作
(1)string的读写
//3.2 string上的操作
//(1)string的读写int main() {string s1, s2;cin >> s1 >> s2;cout << s1 << s2 << endl;return 0;
}
注意:不能用printf直接输出string,需要写成:printf("%s",s.c_str());
(2)使用getline读取一整行
//(2)使用getline读取一整行int main() {string s;getline(cin, s);cout << s << endl;return 0;
}
(3)string 的 empty 和 size 操作(注意 size 是无符号整数,因此 s.size() <= -1 一定成立):
//(3)string的empty和size操作(注意:size是无符号整数,因此s.size()<=-1一定成立):int main() {string s1, s2 = "abc";cout << s1.empty() << endl; // 1cout << s2.empty() << endl; // 0cout << s2.size() << endl; // 3return 0;
}
(4)string 的比较
支持 > < >= <= == != 等所有比较操作,按字典序进行比较
(5)为string对象赋值:
int main() {string s1(10, 'c'), s2; //s1 的内容是cccccccccc;s2是一个空字符串s1 = s2; //赋值:用s2的副本替换s1的副本//此时s1和s2都是空字符串return 0;
}
(6)两个string对象相加:
//2个string对象相加int main() {string s1 = "abc", s2 = "def";string s3 = s1 + s2; //abcdefs3 += s1 + s2; //abcdefabcdefcout << s3 << endl;return 0;
}
(7)字面值和string对象相加:
做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:
string s1 = "hello", s2 = "world";string s3 = s1 + "," + s2 + '!';cout << s3 << endl; //hello,world!
当把string对象和字符字面值及字符串字面值混再一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:
string s4 = s1 + ","; //正确: 把一个string对象和有一个字面值相加//string s5 = "hello" + ","; //错误: 两个运算对象都不是string,//本质上是2个const char*类型的指针相加//2个都是字符串常量,肯定是不能改变,不能进行相加string s6 = s1 + "," + "world"; //正确: 每个加法运算都有一个运算符是string//如果从左到右,有一个string类型的,后面才会隐式类型转换//string s7 = "hello" + "," + s2; //错误: 不能把字面值直接相加,运算是从左到右进行的//从左到右,先是"hello"+","相加,所以不会有隐式类型转换
3.3 处理string对象中的字符
可以将string对象当成字符数组来处理
//3.3 处理string对象中的字符
//可以将string对象当成字符数组来处理int main() {string s = "hello world";for (int i = 0; i < s.size(); i++) {cout << s[i] << " ";}cout << endl;return 0;
}
或者使用基于范围的for语句
int main() {string s = "hello world";//范围for//把字符串s里面的值依次赋给efor (auto e : s) {cout << e << " ";}cout << endl;return 0;
}
如果我们想改变字符串s里面的值,需要在范围for里面传递引用&
int main() {string s = "hello world";for (char& c : s) {c = 'a';}cout << s << endl; //aaaaaaaaaaareturn 0;
}
练习3:信息加密
密码翻译,输入一个只包含小写字母的字符串,将其中的每个字母替换成它的后继字母,如果原字母是'z',则替换成'a'

emmm,咱们还是来画个图~

OK啦!本道题的代码如下:
//信息加密
int main() {string s;getline(cin, s); //如果用cin,遇到空格,会停止读取//使用getline函数,读取一整行int len = s.size(); //求字符串的长度for (int i = 0; i < len; i++) {if (s[i] >= 'a' && s[i] <= 'z') {s[i] = 'a' + (s[i] - 'a' + 1) % 26;}else if (s[i] >= 'A' && s[i] <= 'Z') {s[i] = 'A' + (s[i] - 'A' + 1) % 26;}}cout << s << endl;return 0;
}
我们还可以使用范围for来优化代码:
int main() {string s;getline(cin, s); //如果用cin,遇到空格,会停止读取//使用getline函数,读取一整行//这里要修改字符串s里面的值,必须传引用&for (auto& e : s) {if (e >= 'a' && e <= 'z') {e = 'a' + (e - 'a' + 1) % 26;}else if (e >= 'A' && e <= 'Z') {e = 'A' + (e - 'A' + 1) % 26;}}cout << s << endl;return 0;
}
练习4:字符串长度

其实这道题,就相当于让我们模拟实现strlen函数。
代码如下:
//求字符串长度
int main() {char s1[100] = { 0 };fgets(s1, 100, stdin);//只能用fgets函数,从标准库中最多读取100个字符存入s1中;直到遇见'\n'为止//并且fgets函数会读取空格和'\n'//scanf("%s", s1); //不能用scanf函数,因为scanf遇到空格或者换行,停止读取//cin >> s1; //不能用cin,因为cin遇到空格或者换行,停止读取int len = 0;//当元素值不是'\0'并且不是'\n',才计入字符串的长度for (int i = 0; s1[i] != '\0' && s1[i] != '\n'; i++) {len++;}cout << len << endl; //没有加上s1[i] != '\n'的判断条件时,写成 cout << len-1 << endl; 也可以return 0;
}
方法二:
int main() {string str;getline(cin, str); //使用getline函数读取一整行cout << str.size() << endl;//调用size()函数return 0;
}
片尾
今天我们学习了字符串相关知识点,希望这篇文章对友友们有所帮助!!!
求点赞收藏加关注!!!
谢谢大家!!!

相关文章:
C++蓝桥杯基础篇(七)
片头 嗨~小伙伴们,大家好!今天我们来一起学习蓝桥杯基础篇(七),学习相关字符串的知识,准备好了吗?咱们开始咯! 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…...
常见的非关系性数据库
非关系型数据库(NoSQL)有多种类型,每种类型针对不同的应用场景提供了不同的存储和查询方式。以下是一些常见的非关系型数据库及其特点: 1. 键值数据库(Key-Value Stores) 特点:数据以键值对的…...
【Java反序列化测试】
Java反序列化测试 1. 识别反序列化入口点2. 构造探测Payload3. 发送Payload并观察结果4. 绕过可能的防护5. 自动化工具注意事项总结 Java反序列化测试: 1. 识别反序列化入口点 常见入口: HTTP请求参数(如POST数据、Cookie、Headersÿ…...
代码规范和简化标准
代码规范和简化标准是编写高质量、可维护、可扩展和可读代码的基本原则。遵循这些标准不仅能提高团队协作效率,还能减少出错的概率和后期维护的成本。以下是一些常见的代码规范和简化标准: 1. 命名规范 变量命名: 使用具有描述性的名称&…...
RabbitMQ怎么实现延时支付?
一、使用“死信队列”消息过期时间 1、原理: 设置消息”存活时间“,如果没有被及时消费,就会被丢弃到一个”死信队列“,然后消费者监听这个死信队列处理消息 2、步骤: 2.1、创建两个队列: 2.1.1、普通队…...
node项目前后端密码加密传输及存储方案
前端:使用crypto-js库的SHA256算法,包含用户注册时使用的邮箱加上自定义的secret key生成盐值,接着使用PBKDF2算法进行加密。最后将加密后的密码传给后端。 import CryptoJS from "crypto-js";export const encryptPassword (ema…...
迷你世界脚本方块接口:Block
方块接口:Block 彼得兔 更新时间: 2024-08-27 11:04:56 具体函数名及描述如下: 序号 函数名 函数描述 1 isSolidBlock(...) 是否是固体方块 2 isLiquidBlock(...) 是否是液体方块 3 isAirBlock(...) 是否是气体方块 4 getBl…...
el-input实现金额输入
需求:想要实现一个输入金额的el-input,限制只能输入数字和一个小数点。失焦数字转千分位,聚焦转为数字,超过最大值,红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…...
双碳战略下的智慧能源实践:安科瑞储能管理系统助力企业绿色转型
在全球碳中和目标加速推进的背景下,中国“十四五”规划明确提出构建以新能源为主体的新型电力系统,储能技术成为支撑能源结构转型的核心要素。安科瑞储能能量管理系统作为企业级智慧能源解决方案的核心载体,凭借其技术创新与场景适配能力&…...
《鸢尾花数学大系:从加减乘除到机器学习》开源资源
《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML...
本地部署HDFS集群
首先完成本地部署大数据集群前置准备,可参考: 本地部署大数据集群前置准备https://blog.csdn.net/m0_73641796/article/details/145994787?spm1001.2014.3001.5501 1.下载hadoop 下载Hadoop安装包,本文用的是hadoop-3.3.4.tar.gz 2. 集群…...
Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建
Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建 目录 安装 Nginx 和 PHP配置 Nginx配置 PHP启动服务ThinkPHP 配置常见问题排查 1. 安装 Nginx 和 PHP 安装 Nginx 访问 Nginx 官网 下载 Windows 版本解压到指定目录,如 C:\nginx 安装 PHP 访问 PHP 官网…...
10.【线性代数】—— 四个基本子空间
十、 四个基本子空间 1. 列空间 C ( A ) C(A) C(A) in R m R^m Rm2. 零空间 N ( A ) N(A) N(A) in R n R^n Rn3. 行空间 C ( A T ) C(A^T) C(AT) in R n R^n Rn4. 左零空间 N ( A T ) N(A^T) N(AT) in R m R^m Rm综述5. 新的向量空间 讨论矩阵 A m ∗ n A_{m*n} Am∗n…...
基于vue框架的游戏商城系统cq070(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,分类,商品信息,游戏高手,游戏代练 开题报告内容 基于Vue框架的游戏商城系统开题报告 一、研究背景与意义 随着互联网技术的飞速发展和游戏产业的蓬勃兴起,游戏商城作为游戏产业链中的重要一环,迎来了前所…...
我代表中国受邀在亚马逊云科技全球云计算大会re:Invent中技术演讲
大家好我是小李哥,本名叫李少奕,目前在一家金融行业公司担任首席云计算工程师。去年5月很荣幸在全球千万名开发者中被选为了全球亚马逊云科技认证技术专家(AWS Hero),是近10年来大陆地区仅有的第9名大陆专家。同时作为…...
css3d放置的面板方向不对问题排查
以往在threejs左手坐标系下,cameranew THREE.Vector3(0, 0, 1),好像在贴css3d的时候从来不会出问题。而这次接到一个朋友是用右手坐标系的,camera默认不设置方向,则应该是(0,1,0) c…...
网络安全法与等级保护 PPT 精华汇总
资源描述 本资源文件为《网络安全法与等级保护》的PPT精华汇总,内容涵盖了网络安全法与等级保护的总体框架及相关标准规范。该PPT详细介绍了网络安全法与等级保护的各个章节和条款,并提供了基础类和应用类的相关标准文件,帮助读者全面了解和…...
chrome下载文件提示“贵组织屏蔽了该文件,因为它不符合安全政策” 安装chrome插件出现问题
查了一圈发现有如下解决方法 可逐一排查 1. 检查是否安装了阿里旺旺,会导致你无法安装chrome的插件。卸载阿里旺旺后,重启chrome即可 2. 注册表出现问题,删除\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome 下的 EnabledPlugins 文…...
linux磁盘满了怎么安全删除文件
df -h 通过df -h /dir 查看被占满的目录,dir替换为你的文件目录 du -sh * 进入被占满的目录,执行 du -sh * ,查看哪些文件占的磁盘大 查看占用磁盘最大的文件 du -sh * | sort -rh | head -n N N通常可以设置为10 有的docker容器文件太…...
探秘基带算法:从原理到5G时代的通信变革【十】基带算法应用与对比
文章目录 三、算法在现代通信系统中的应用3.1 5G 通信中的应用3.1.1 信道编码与调制解调3.1.2 大规模 MIMO 技术3.1.3 案例分析:5G 基站与终端实现 3.2 卫星通信中的应用3.2.1 抗干扰与纠错编码3.2.2 信号处理与调制解调3.2.3 案例分析:卫星通信系统实例…...
io学习----->标准io
思维导图: 一.io的作用 io是实现对文件的操作,把运行结果存到文件中,读取文件的数据,方便后期查询。 二.io的概念 io是指系统 和外部设备或用户之间的数据交互 I:input 表示数据从外部设备输入到内存中; O:output…...
go语言中字符串嵌套
在Go语言中,字符串嵌套通常是指在字符串中包含另一个字符串。可以通过以下几种方式实现: 1. 使用双引号和转义字符 如果需要在字符串中嵌套双引号,可以使用转义字符 \ 来表示内部的双引号。例如: s : "He said, \"He…...
2024-2025学年职业院校技能大赛“大数据应用开发”赛项竞赛样题-解析
2025年职业院校技术大赛-高职大数据应用开发赛项专题。 2024-2025学年广东省职业院校技能大赛“大数据应用开发”赛项竞赛样题1-任务B:离线数据处理_解析2024-2025学年广东省职业院校技能大赛“大数据应用开发”赛项竞赛样题2-任务B:离线数据处理_解析2…...
LeetCode 面试题 17.19. 消失的两个数字
LeetCode 面试题 17.19. 消失的两个数字 思路🧐: 运用位运算,我们先创建一个变量tmp,依次异或nums和1~N所有整数,此时就可以得到两个数的异或值。 然后通过右移操作,逐位检查tmp中的每一位,找到…...
KaiwuDB| Google Spanner 经典架构回顾
前言 大数据时代 ,随着移动互联网和物联网技术的发展 , 全球数据量呈现爆发式增长,已经远远超出集中式单机数据库的处理能力。CCF 数据库专委 2021 年发布的《“十四五”数据库发展趋势与挑战》显示, 各行各业海量数据的管理需求…...
拼电商客户管理系统
内容来自:尚硅谷 难度:easy 目 标 l 模拟实现一个基于文本界面的 《 拼电商客户管理系统 》 l 进一步掌握编程技巧和调试技巧,熟悉面向对象编程 l 主要涉及以下知识点: 类结构的使用:属性、方法及构造器 对象的创建与…...
Electron、Tauri及其它跨平台方案终极对比
Electron、Tauri及跨平台方案终极对比(2025版) 一、核心框架深度解析 1.1 Electron:Web技术的桌面霸主 技术架构 基于Chromium(浏览器内核) Node.js(后端运行时)的双进程架构,支持…...
WireGuard搭建网络,供整个公司使用
一、清理现有配置(如已有失败尝试) # 停止并删除现有 WireGuard 接口 sudo wg-quick down wg0 sudo rm -rf /etc/wireguard/wg0.conf# 验证接口已删除 (执行后应该看不到 wg0) ifconfig二、服务器端完整配置流程 1. 安装 WireGuard sudo apt update &…...
项目准备(flask+pyhon+MachineLearning)- 1
目录 这是一篇学习笔记 1. 搭建项目 2.前期准备工作 3.创建用户(user)模板 这是一篇学习笔记 目的:用flask快速实现发布有关机器学习的项目,掌握flask框架,机器学习模型的存储和调用。 1. 搭建项目 使用pycharm创建项目,fl…...
1.2.2 使用Maven方式构建Spring Boot项目
本次实战通过Maven方式构建了一个Spring Boot项目,实现了简单的Web应用。首先,创建了Maven项目并设置好项目名称、位置、构建系统和JDK等。接着,添加了Spring Boot的父项目依赖和web、thymeleaf起步依赖。然后,创建了项目启动类He…...
