从零开始的C++第五天:让程序听懂自然语言
前四天我们搭建了一个功能完整的计算器但有一个小瑕疵用户必须严格按照数字 运算符 数字的格式输入比如3 5中间必须带空格。如果用户想输入35不带空格或者3 5多个空格程序就会出错。今天我们就来解决这个问题让程序变得更智能、更友好。 回顾与目标第四天结束时我们获取用户输入的方式是cpp复制下载cin x oper y;cin 默认用空格、制表符、换行作为分隔符。所以35会被当成一个整体35试图存入double变量x时就会失败。今天我们要做两件事学习字符串处理——C如何操作文本改造计算器——让用户输入35、3 5、3 5都能正确识别 第一部分认识C中的字符串在C中有两种方式表示字符串1. C风格字符串C-Style Stringcpp复制下载char name[] Hello; // 字符数组末尾有隐藏的 \0这是从C语言继承来的方式操作起来比较麻烦需要手动管理内存、使用strcpy、strlen等函数新手容易出错。2. C标准库字符串std::stringcpp复制下载#include string using namespace std; string name Hello;这是C推荐的字符串类型使用起来非常方便支持拼接支持比较支持.length()获取长度支持[]索引访问自动管理内存无需担心溢出std::string常用操作速查cpp复制下载#include iostream #include string using namespace std; int main() { string s1 Hello; string s2 World; // 拼接 string s3 s1 s2; // Hello World // 长度 int len s3.length(); // 11 // 索引访问从0开始 char first s3[0]; // H char last s3[s3.length() - 1]; // d // 查找子串 int pos s3.find(World); // 6World从第6个字符开始 if (pos ! string::npos) { cout 找到了位置在 pos endl; } // 截取子串 string sub s3.substr(0, 5); // Hello从位置0开始取5个字符 // 判断是否为空 if (s3.empty()) { cout 字符串为空 endl; } // 清空 s3.clear(); return 0; } 第二部分解析用户输入——从35中提取数字和运算符核心思路是把用户输入的整个字符串读进来然后逐个字符分析。步骤1用getline读取整行输入cin 会忽略空格无法读取整行。我们需要用getlinecpp复制下载#include iostream #include string using namespace std; int main() { string input; cout 请输入算式; getline(cin, input); // 读取一整行包括空格 cout 你输入了 input endl; return 0; }步骤2设计解析算法我们要从字符串中提取出第一个数字、运算符、第二个数字。以35为例解析思路如下text复制下载遍历字符串中的每个字符 如果当前字符是数字或小数点 → 拼接到当前数字中 如果当前字符是运算符 - * /→ 记录运算符 如果当前字符是空格 → 跳过步骤3实现解析函数cpp复制下载#include iostream #include string using namespace std; bool ParseExpression(const string input, double x, char oper, double y) { string num1 ; // 第一个数字的字符串形式 string num2 ; // 第二个数字的字符串形式 oper \0; // 运算符初始化为空 bool foundOper false; for (char ch : input) { // C11 范围for循环遍历每个字符 if (ch ) { continue; // 遇到空格直接跳过 } if (ch || ch - || ch * || ch /) { if (foundOper) { cout 错误只能有一个运算符 endl; return false; } oper ch; foundOper true; } else if ( (ch 0 ch 9) || ch . ) { // 数字或小数点 if (!foundOper) { num1 ch; // 运算符还没出现属于第一个数字 } else { num2 ch; // 运算符已出现属于第二个数字 } } else { cout 错误包含非法字符 ch endl; return false; } } // 检查是否都找到了 if (num1.empty() || num2.empty() || oper \0) { cout 错误格式不正确请确保输入格式为 ab 或 a-b 等 endl; return false; } // 将字符串转换为数字 x stod(num1); // string to double y stod(num2); return true; } 新知识点详解1. 范围for循环Range-based for loopcpp复制下载for (char ch : input) { // 遍历 input 中的每一个字符依次赋值给 ch }这是C11引入的语法比传统的for (int i 0; i input.length(); i)更简洁。2.stod(string to double)cpp复制下载double num stod(3.14); // num 3.14这是C标准库提供的函数将字符串转换为浮点数。如果转换失败会抛出异常后续学习内容这里我们假设用户输入的是合法数字。3.string::empty()cpp复制下载if (num1.empty()) { ... } // 判断字符串是否为空 第三部分测试我们的解析器先写一个小程序单独测试解析功能cpp复制下载#include iostream #include string using namespace std; // 把上面的 ParseExpression 函数复制到这里 int main() { string input; double x, y; char oper; cout 测试解析器输入 q 退出 endl; while (true) { cout 请输入算式; getline(cin, input); if (input q || input Q) { break; } if (ParseExpression(input, x, oper, y)) { cout 解析成功 endl; cout x x , oper oper , y y endl; } } return 0; }测试用例35→ x3, oper, y5 ✅3 5→ x3, oper, y5 ✅3 5→ x3, oper, y5 ✅3.14*2→ x3.14, oper*, y2 ✅35→ 报错 ✅多个运算符abc→ 报错 ✅非法字符3→ 报错 ✅缺少第二个数字️ 第四部分整合到计算器主程序现在我们把解析功能整合到之前的计算器程序中。修改PerformCalculation函数cpp复制下载#include iostream #include string #include Calculator.h using namespace std; // 将 ParseExpression 声明放在这里 bool ParseExpression(const string input, double x, char oper, double y); void PerformCalculation(Calculator calc) { string input; double x 0.0, y 0.0; char oper ; cout 请输入算式例如35 或 3.14*2; getline(cin, input); // 读取整行 // 如果用户直接按回车重新提示 if (input.empty()) { cout 输入不能为空请重新输入 endl; return; } if (!ParseExpression(input, x, oper, y)) { return; // 解析失败直接返回错误信息已在ParseExpression中输出 } double result calc.Calculate(x, oper, y); cout x oper y result endl; }⚠️注意在main函数中如果前面使用了cin choice来读取菜单选项之后再用getline读取算式会遇到一个经典问题getline会读取到cin 留在输入缓冲区中的换行符\n导致第一次getline读到空字符串。解决方案在cin choice之后调用cin.ignore()清除缓冲区中的换行符cpp复制下载cin choice; cin.ignore(); // 忽略缓冲区中剩余的换行符 第五部分完整的第五天代码CalculatorTutorial.cppcpp复制下载#include iostream #include string #include Calculator.h using namespace std; // 函数声明 bool ParseExpression(const string input, double x, char oper, double y); void PerformCalculation(Calculator calc); void ShowMenu(); // 主函数 int main() { Calculator c; int choice 0; do { ShowMenu(); cin choice; cin.ignore(); // 清空缓冲区中的换行符为后面的getline做准备 if (choice 1) { PerformCalculation(c); } else if (choice 2) { cout 感谢使用再见 endl; break; } else { cout 无效输入请重新选择 endl; } } while (true); return 0; } // 函数定义 void ShowMenu() { cout \n 计算器 endl; cout 1. 进行计算 endl; cout 2. 退出程序 endl; cout 请选择输入数字; } bool ParseExpression(const string input, double x, char oper, double y) { string num1 ; string num2 ; oper \0; bool foundOper false; for (char ch : input) { if (ch ) { continue; } if (ch || ch - || ch * || ch /) { if (foundOper) { cout ❌ 错误只能有一个运算符 endl; return false; } oper ch; foundOper true; } else if ((ch 0 ch 9) || ch .) { if (!foundOper) { num1 ch; } else { num2 ch; } } else { cout ❌ 错误包含非法字符 ch endl; return false; } } if (num1.empty() || num2.empty() || oper \0) { cout ❌ 错误格式不正确请确保输入格式为 ab 或 a-b 等 endl; return false; } try { x stod(num1); y stod(num2); } catch (...) { cout ❌ 错误数字格式无效 endl; return false; } return true; } void PerformCalculation(Calculator calc) { string input; double x 0.0, y 0.0; char oper ; cout 请输入算式例如35 或 3.14*2; getline(cin, input); if (input.empty()) { cout 输入不能为空请重新输入 endl; return; } if (!ParseExpression(input, x, oper, y)) { return; } double result calc.Calculate(x, oper, y); cout x oper y result endl; } 第五天前四天我们搭建了一个功能完整的计算器但有一个小瑕疵用户必须严格按照数字 运算符 数字的格式输入比如3 5中间必须带空格。如果用户想输入35不带空格或者3 5多个空格程序就会出错。今天我们就来解决这个问题让程序变得更智能、更友好。 回顾与目标第四天结束时我们获取用户输入的方式是cpp复制下载cin x oper y;cin 默认用空格、制表符、换行作为分隔符。所以35会被当成一个整体35试图存入double变量x时就会失败。今天我们要做两件事学习字符串处理——C如何操作文本改造计算器——让用户输入35、3 5、3 5都能正确识别 第一部分认识C中的字符串在C中有两种方式表示字符串1. C风格字符串C-Style Stringcpp复制下载char name[] Hello; // 字符数组末尾有隐藏的 \0这是从C语言继承来的方式操作起来比较麻烦需要手动管理内存、使用strcpy、strlen等函数新手容易出错。2. C标准库字符串std::stringcpp复制下载#include string using namespace std; string name Hello;这是C推荐的字符串类型使用起来非常方便支持拼接支持比较支持.length()获取长度支持[]索引访问自动管理内存无需担心溢出std::string常用操作速查cpp复制下载#include iostream #include string using namespace std; int main() { string s1 Hello; string s2 World; // 拼接 string s3 s1 s2; // Hello World // 长度 int len s3.length(); // 11 // 索引访问从0开始 char first s3[0]; // H char last s3[s3.length() - 1]; // d // 查找子串 int pos s3.find(World); // 6World从第6个字符开始 if (pos ! string::npos) { cout 找到了位置在 pos endl; } // 截取子串 string sub s3.substr(0, 5); // Hello从位置0开始取5个字符 // 判断是否为空 if (s3.empty()) { cout 字符串为空 endl; } // 清空 s3.clear(); return 0; } 第二部分解析用户输入——从35中提取数字和运算符核心思路是把用户输入的整个字符串读进来然后逐个字符分析。步骤1用getline读取整行输入cin 会忽略空格无法读取整行。我们需要用getlinecpp复制下载#include iostream #include string using namespace std; int main() { string input; cout 请输入算式; getline(cin, input); // 读取一整行包括空格 cout 你输入了 input endl; return 0; }步骤2设计解析算法我们要从字符串中提取出第一个数字、运算符、第二个数字。以35为例解析思路如下text复制下载遍历字符串中的每个字符 如果当前字符是数字或小数点 → 拼接到当前数字中 如果当前字符是运算符 - * /→ 记录运算符 如果当前字符是空格 → 跳过步骤3实现解析函数cpp复制下载#include iostream #include string using namespace std; bool ParseExpression(const string input, double x, char oper, double y) { string num1 ; // 第一个数字的字符串形式 string num2 ; // 第二个数字的字符串形式 oper \0; // 运算符初始化为空 bool foundOper false; for (char ch : input) { // C11 范围for循环遍历每个字符 if (ch ) { continue; // 遇到空格直接跳过 } if (ch || ch - || ch * || ch /) { if (foundOper) { cout 错误只能有一个运算符 endl; return false; } oper ch; foundOper true; } else if ( (ch 0 ch 9) || ch . ) { // 数字或小数点 if (!foundOper) { num1 ch; // 运算符还没出现属于第一个数字 } else { num2 ch; // 运算符已出现属于第二个数字 } } else { cout 错误包含非法字符 ch endl; return false; } } // 检查是否都找到了 if (num1.empty() || num2.empty() || oper \0) { cout 错误格式不正确请确保输入格式为 ab 或 a-b 等 endl; return false; } // 将字符串转换为数字 x stod(num1); // string to double y stod(num2); return true; } 新知识点详解1. 范围for循环Range-based for loopcpp复制下载for (char ch : input) { // 遍历 input 中的每一个字符依次赋值给 ch }这是C11引入的语法比传统的for (int i 0; i input.length(); i)更简洁。2.stod(string to double)cpp复制下载double num stod(3.14); // num 3.14这是C标准库提供的函数将字符串转换为浮点数。如果转换失败会抛出异常后续学习内容这里我们假设用户输入的是合法数字。3.string::empty()cpp复制下载if (num1.empty()) { ... } // 判断字符串是否为空 第三部分测试我们的解析器先写一个小程序单独测试解析功能cpp复制下载#include iostream #include string using namespace std; // 把上面的 ParseExpression 函数复制到这里 int main() { string input; double x, y; char oper; cout 测试解析器输入 q 退出 endl; while (true) { cout 请输入算式; getline(cin, input); if (input q || input Q) { break; } if (ParseExpression(input, x, oper, y)) { cout 解析成功 endl; cout x x , oper oper , y y endl; } } return 0; }测试用例35→ x3, oper, y5 ✅3 5→ x3, oper, y5 ✅3 5→ x3, oper, y5 ✅3.14*2→ x3.14, oper*, y2 ✅35→ 报错 ✅多个运算符abc→ 报错 ✅非法字符3→ 报错 ✅缺少第二个数字️ 第四部分整合到计算器主程序现在我们把解析功能整合到之前的计算器程序中。修改PerformCalculation函数cpp复制下载#include iostream #include string #include Calculator.h using namespace std; // 将 ParseExpression 声明放在这里 bool ParseExpression(const string input, double x, char oper, double y); void PerformCalculation(Calculator calc) { string input; double x 0.0, y 0.0; char oper ; cout 请输入算式例如35 或 3.14*2; getline(cin, input); // 读取整行 // 如果用户直接按回车重新提示 if (input.empty()) { cout 输入不能为空请重新输入 endl; return; } if (!ParseExpression(input, x, oper, y)) { return; // 解析失败直接返回错误信息已在ParseExpression中输出 } double result calc.Calculate(x, oper, y); cout x oper y result endl; }⚠️注意在main函数中如果前面使用了cin choice来读取菜单选项之后再用getline读取算式会遇到一个经典问题getline会读取到cin 留在输入缓冲区中的换行符\n导致第一次getline读到空字符串。解决方案在cin choice之后调用cin.ignore()清除缓冲区中的换行符cpp复制下载cin choice; cin.ignore(); // 忽略缓冲区中剩余的换行符 第五部分完整的第五天代码CalculatorTutorial.cppcpp复制下载#include iostream #include string #include Calculator.h using namespace std; // 函数声明 bool ParseExpression(const string input, double x, char oper, double y); void PerformCalculation(Calculator calc); void ShowMenu(); // 主函数 int main() { Calculator c; int choice 0; do { ShowMenu(); cin choice; cin.ignore(); // 清空缓冲区中的换行符为后面的getline做准备 if (choice 1) { PerformCalculation(c); } else if (choice 2) { cout 感谢使用再见 endl; break; } else { cout 无效输入请重新选择 endl; } } while (true); return 0; } // 函数定义 void ShowMenu() { cout \n 计算器 endl; cout 1. 进行计算 endl; cout 2. 退出程序 endl; cout 请选择输入数字; } bool ParseExpression(const string input, double x, char oper, double y) { string num1 ; string num2 ; oper \0; bool foundOper false; for (char ch : input) { if (ch ) { continue; } if (ch || ch - || ch * || ch /) { if (foundOper) { cout ❌ 错误只能有一个运算符 endl; return false; } oper ch; foundOper true; } else if ((ch 0 ch 9) || ch .) { if (!foundOper) { num1 ch; } else { num2 ch; } } else { cout ❌ 错误包含非法字符 ch endl; return false; } } if (num1.empty() || num2.empty() || oper \0) { cout ❌ 错误格式不正确请确保输入格式为 ab 或 a-b 等 endl; return false; } try { x stod(num1); y stod(num2); } catch (...) { cout ❌ 错误数字格式无效 endl; return false; } return true; } void PerformCalculation(Calculator calc) { string input; double x 0.0, y 0.0; char oper ; cout 请输入算式例如35 或 3.14*2; getline(cin, input); if (input.empty()) { cout 输入不能为空请重新输入 endl; return; } if (!ParseExpression(input, x, oper, y)) { return; } double result calc.Calculate(x, oper, y); cout x oper y result endl; } 第五天知识点地图知识点作用关键代码std::string现代化字符串处理#include string字符串拼接合并字符串s1 s2字符串长度获取字符数s.length()字符串索引访问单个字符s[0]getline读取整行输入含空格getline(cin, input)范围for循环遍历字符串每个字符for (char ch : input)stod字符串转浮点数double num stod(3.14);cin.ignore()清除输入缓冲区cin.ignore();try-catch捕获异常简单入门try { ... } catch (...) { ... }知识点地图知识点作用关键代码std::string现代化字符串处理#include string字符串拼接合并字符串s1 s2字符串长度获取字符数s.length()字符串索引访问单个字符s[0]getline读取整行输入含空格getline(cin, input)范围for循环遍历字符串每个字符for (char ch : input)stod字符串转浮点数double num stod(3.14);cin.ignore()清除输入缓冲区cin.ignore();try-catch捕获异常简单入门try { ... } catch (...) { ... }

相关新闻

SkillEvolver:让 Agent 学会“自己写技能”的元技能框架

SkillEvolver:让 Agent 学会“自己写技能”的元技能框架

一、一句话概述 SkillEvolver 的核心想法很直接:与其让人手写 Agent skill,或者让模型一次性“凭记忆”生成 skill,不如给 Agent 一个 meta-skill,让它在少量训练任务试错中,自动探索、编写、部署、审计并迭代出一个可…

2026/9/18 11:56:21 阅读更多 →
ADS8588S高精度同步ADC:多通道数据采集系统设计实战指南

ADS8588S高精度同步ADC:多通道数据采集系统设计实战指南

1. 项目概述:为什么我们需要ADS8588S这样的高精度同步ADC?在工业自动化、电力监控或者多相电机控制的项目里,我们工程师常常会遇到一个头疼的问题:如何同时、准确地捕捉多路快速变化的模拟信号?比如,你想监…

2026/9/17 22:27:10 阅读更多 →
AI驱动决策:企业智能体系统的架构与演进

AI驱动决策:企业智能体系统的架构与演进

1. 为什么企业决策正在从"经验主义"转向"AI驱动"去年参加行业峰会时,我注意到一个有趣现象:当讨论到市场策略时,传统企业高管们还在说"根据我20年经验...",而新兴企业的年轻CEO们已经在展示"我…

2026/9/19 21:08:45 阅读更多 →

最新新闻

Matlab机器人工具箱六轴机械臂DH参数建模与3D可视化实战

Matlab机器人工具箱六轴机械臂DH参数建模与3D可视化实战

1. 六轴机械臂建模到底在解决什么问题很多人第一次接触六轴机械臂,脑子里冒出来的第一个念头是"这玩意儿怎么动起来的"。六个关节,每个关节转一个角度,末端执行器就能到达空间里某个特定位置和姿态——这件事听起来简单&#xff0c…

2026/9/20 20:35:01 阅读更多 →
免费公共tracker列表:4步让qBittorrent满速

免费公共tracker列表:4步让qBittorrent满速

免费公共tracker列表:4步让qBittorrent满速 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist trackerslist 是一个专门维护公共 tracker 列表的开源项目,每天自动体检、更新一…

2026/9/20 20:35:01 阅读更多 →
在 Compiler Explorer 中通过 Dosbox 运行 Turbo C:Linux 环境部署与配置指南

在 Compiler Explorer 中通过 Dosbox 运行 Turbo C:Linux 环境部署与配置指南

后端前端开发工具 【免费下载链接】compiler-explorer Run compilers interactively from your web browser and interact with the assembly 项目地址: https://gitcode.com/gh_mirrors/co/compiler-explorer 点击查看 免费下载 本文以 Compiler Explorer 官方文档…

2026/9/20 20:35:01 阅读更多 →
金仓SQL防火墙:数据库安全防护实战解析

金仓SQL防火墙:数据库安全防护实战解析

1. 数据库安全防护的最后一公里十年前我刚入行时参与过一个电商项目,凌晨三点被电话惊醒——用户数据被拖库了。攻击者利用一个普通的查询接口,通过精心构造的SQL语句,像用吸管喝奶茶一样把整个用户表数据抽得一干二净。那次事件让我深刻认识…

2026/9/20 20:35:01 阅读更多 →
ESP-BLE-MESH 完整实战指南:蓝牙 Mesh 功能、模型与示例一文讲透

ESP-BLE-MESH 完整实战指南:蓝牙 Mesh 功能、模型与示例一文讲透

ESP-BLE-MESH 完整实战指南:蓝牙 Mesh 功能、模型与示例一文讲透 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf ESP-BLE-…

2026/9/20 20:35:01 阅读更多 →
Roc 语言 return 语句深度解析:从语法快照测试到编译器源码实现

Roc 语言 return 语句深度解析:从语法快照测试到编译器源码实现

【免费下载链接】roc A fast, friendly, functional language. 项目地址: https://gitcode.com/GitHub_Trending/ro/roc 点击查看 免费下载 本篇以 Roc 编译器仓库中的快照测试文档 test/snapshots/statement/return_stmt.md 为核心线索,系统讲解 retur…

2026/9/20 20:34:01 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →