JSON格式,C语言自己实现,以及直接调用库函数(一)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。以下为你提供不同场景下常见的 JSON 格式示例。
1. 简单对象
JSON 对象是由键值对组成,用花括号 {} 包裹,键和值之间用冒号 : 分隔,多个键值对之间用逗号 , 分隔。
{"name": "John Doe","age": 30,"isStudent": false,"hometown": null
}
2. 嵌套对象
JSON 对象可以嵌套,即一个对象的键对应的值可以是另一个对象。
json
{"person": {"name": "Alice","age": 25,"contact": {"email": "alice@example.com","phone": "123-456-7890"}}
}
3. 数组
JSON 数组是由值组成的有序列表,用方括号 [] 包裹,值之间用逗号 , 分隔。数组中的值可以是不同的数据类型,也可以是对象或数组。
["apple","banana","cherry"
]
4. 对象数组
数组中的元素可以是 JSON 对象。
[{"id": 1,"name": "Product A","price": 19.99},{"id": 2,"name": "Product B","price": 29.99}
]
5. 复杂嵌套结构
结合对象和数组可以形成更复杂的嵌套结构。
{"employees": [{"name": "Bob","department": "Sales","projects": [{"projectName": "Project X","startDate": "2023-01-01"},{"projectName": "Project Y","startDate": "2023-06-01"}]},{"name": "Eve","department": "Marketing","projects": [{"projectName": "Project Z","startDate": "2023-03-01"}]}]
}
6. 包含不同数据类型的对象
{"title": "Sample Document","author": {"firstName": "Jane","lastName": "Smith"},"tags": ["document", "sample"],"views": 1234,"isPublished": true
}
二、
如果没有现成的 JSON 库,要自己实现 JSON 数据的解析和生成,可以按照 JSON 数据的结构特点,通过字符串处理来完成。以下分别介绍如何手动实现 JSON 对象和数组的解析与生成。
1. JSON 解析
解析思路
JSON 对象:JSON 对象由键值对组成,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔,整体用花括号 {} 包裹。解析时需要识别键和值,处理嵌套对象和数组。
JSON 数组:JSON 数组由值组成,值之间用逗号 , 分隔,整体用方括号 [] 包裹。解析时需要逐个提取数组元素。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 跳过空白字符
void skip_whitespace(const char **json) {while (**json == ' ' || **json == '\t' || **json == '\n' || **json == '\r') {(*json)++;}
}// 解析字符串
char *parse_string(const char **json) {(*json)++; // 跳过起始的双引号const char *start = *json;while (**json != '\0' && **json != '"') {(*json)++;}size_t len = *json - start;char *str = (char *)malloc(len + 1);if (str == NULL) {return NULL;}memcpy(str, start, len);str[len] = '\0';(*json)++; // 跳过结束的双引号return str;
}// 解析数字
int parse_number(const char **json) {int num = 0;while (**json >= '0' && **json <= '9') {num = num * 10 + (**json - '0');(*json)++;}return num;
}// 解析 JSON 对象
void parse_object(const char **json) {(*json)++; // 跳过起始的花括号skip_whitespace(json);while (**json != '}') {char *key = parse_string(json);skip_whitespace(json);(*json)++; // 跳过冒号skip_whitespace(json);if (**json == '"') {char *value = parse_string(json);printf("Key: %s, Value: %s\n", key, value);free(value);} else if (**json >= '0' && **json <= '9') {int value = parse_number(json);printf("Key: %s, Value: %d\n", key, value);}free(key);skip_whitespace(json);if (**json == ',') {(*json)++;skip_whitespace(json);}}(*json)++; // 跳过结束的花括号
}// 解析 JSON 数组
void parse_array(const char **json) {(*json)++; // 跳过起始的方括号skip_whitespace(json);while (**json != ']') {if (**json == '"') {char *value = parse_string(json);printf("Array value: %s\n", value);free(value);} else if (**json >= '0' && **json <= '9') {int value = parse_number(json);printf("Array value: %d\n", value);}skip_whitespace(json);if (**json == ',') {(*json)++;skip_whitespace(json);}}(*json)++; // 跳过结束的方括号
}// 主解析函数
void parse_json(const char *json) {skip_whitespace(&json);if (*json == '{') {parse_object(&json);} else if (*json == '[') {parse_array(&json);}
}int main() {const char *json_str = "{\"name\": \"John\", \"age\": 30}";parse_json(json_str);return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 生成 JSON 字符串表示的对象
char *generate_json_object(const char *key, const char *value) {size_t key_len = strlen(key);size_t value_len = strlen(value);size_t json_len = 2 + key_len + 2 + 1 + 2 + value_len + 2; // {} "" : ""char *json = (char *)malloc(json_len);if (json == NULL) {return NULL;}sprintf(json, "{\"%s\": \"%s\"}", key, value);return json;
}// 生成 JSON 字符串表示的数组
char *generate_json_array(const char **values, int count) {size_t total_len = 2; // []for (int i = 0; i < count; i++) {total_len += strlen(values[i]) + 2; // ""if (i < count - 1) {total_len++; // ,}}char *json = (char *)malloc(total_len);if (json == NULL) {return NULL;}json[0] = '[';size_t index = 1;for (int i = 0; i < count; i++) {json[index++] = '"';strcpy(json + index, values[i]);index += strlen(values[i]);json[index++] = '"';if (i < count - 1) {json[index++] = ',';}}json[index] = ']';json[index + 1] = '\0';return json;
}int main() {const char *key = "name";const char *value = "John";char *json_obj = generate_json_object(key, value);if (json_obj != NULL) {printf("JSON object: %s\n", json_obj);free(json_obj);}const char *values[] = {"apple", "banana", "cherry"};int count = sizeof(values) / sizeof(values[0]);char *json_arr = generate_json_array(values, count);if (json_arr != NULL) {printf("JSON array: %s\n", json_arr);free(json_arr);}return 0;
}
2
{"employees": [{"name": "Bob","department": "Sales","projects": [{"projectName": "Project X","startDate": "2023-01-01"},{"projectName": "Project Y","startDate": "2023-06-01"}]},{"name": "Eve","department": "Marketing","projects": [{"projectName": "Project Z","startDate": "2023-03-01"}]}]
}
下面是解析该 JSON 数据的 C 语言代码:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"int main() {const char *json_str = "{\"employees\": [{\"name\": \"Bob\", \"department\": \"Sales\", \"projects\": [{\"projectName\": \"Project X\", \"startDate\": \"2023-01-01\"}, {\"projectName\": \"Project Y\", \"startDate\": \"2023-06-01\"}]}, {\"name\": \"Eve\", \"department\": \"Marketing\", \"projects\": [{\"projectName\": \"Project Z\", \"startDate\": \"2023-03-01\"}]}]}";// 解析 JSON 字符串cJSON *root = cJSON_Parse(json_str);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "Error before: %s\n", error_ptr);}return 1;}// 获取 employees 数组cJSON *employees = cJSON_GetObjectItem(root, "employees");if (cJSON_IsArray(employees)) {int array_size = cJSON_GetArraySize(employees);for (int i = 0; i < array_size; i++) {cJSON *employee = cJSON_GetArrayItem(employees, i);cJSON *name = cJSON_GetObjectItem(employee, "name");cJSON *department = cJSON_GetObjectItem(employee, "department");if (cJSON_IsString(name) && cJSON_IsString(department)) {printf("Employee Name: %s\n", name->valuestring);printf("Department: %s\n", department->valuestring);}// 获取 projects 数组cJSON *projects = cJSON_GetObjectItem(employee, "projects");if (cJSON_IsArray(projects)) {int project_size = cJSON_GetArraySize(projects);printf("Projects:\n");for (int j = 0; j < project_size; j++) {cJSON *project = cJSON_GetArrayItem(projects, j);cJSON *projectName = cJSON_GetObjectItem(project, "projectName");cJSON *startDate = cJSON_GetObjectItem(project, "startDate");if (cJSON_IsString(projectName) && cJSON_IsString(startDate)) {printf(" - Project Name: %s\n", projectName->valuestring);printf(" Start Date: %s\n", startDate->valuestring);}}}printf("\n");}}// 释放 cJSON 对象占用的内存cJSON_Delete(root);return 0;
}
- 生成 JSON 数据
下面的代码展示了如何使用 cJSON 库生成一个包含不同数据类型的 JSON 对象:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"int main() {// 创建根 JSON 对象cJSON *root = cJSON_CreateObject();if (root == NULL) {fprintf(stderr, "Failed to create JSON object\n");return 1;}// 添加字符串类型的键值对cJSON_AddStringToObject(root, "title", "Sample Document");// 创建嵌套的 author 对象cJSON *author = cJSON_CreateObject();if (author == NULL) {fprintf(stderr, "Failed to create author object\n");cJSON_Delete(root);return 1;}cJSON_AddStringToObject(author, "firstName", "Jane");cJSON_AddStringToObject(author, "lastName", "Smith");cJSON_AddItemToObject(root, "author", author);// 创建 tags 数组cJSON *tags = cJSON_CreateArray();if (tags == NULL) {fprintf(stderr, "Failed to create tags array\n");cJSON_Delete(root);return 1;}cJSON_AddItemToArray(tags, cJSON_CreateString("document"));cJSON_AddItemToArray(tags, cJSON_CreateString("sample"));cJSON_AddItemToObject(root, "tags", tags);// 添加数字类型的键值对cJSON_AddNumberToObject(root, "views", 1234);// 添加布尔类型的键值对cJSON_AddBoolToObject(root, "isPublished", 1);// 将 JSON 对象转换为字符串char *json_str = cJSON_Print(root);if (json_str == NULL) {fprintf(stderr, "Failed to print JSON object\n");cJSON_Delete(root);return 1;}// 打印 JSON 字符串printf("%s\n", json_str);// 释放内存free(json_str);cJSON_Delete(root);return 0;
}
下面为你展示如何使用 C 语言结合 cJSON 库,以文件形式读写和保存 JSON 数据。我们会提供两个示例,一个是从文件中读取 JSON 数据并解析,另一个是将生成的 JSON 数据保存到文件中。
1. 从文件读取并解析 JSON 数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"// 从文件读取内容到字符串
char* read_file(const char* filename) {FILE* file = fopen(filename, "r");if (file == NULL) {perror("Failed to open file");return NULL;}// 获取文件大小fseek(file, 0, SEEK_END);long size = ftell(file);fseek(file, 0, SEEK_SET);// 分配内存来存储文件内容char* buffer = (char*)malloc(size + 1);if (buffer == NULL) {perror("Failed to allocate memory");fclose(file);return NULL;}// 读取文件内容fread(buffer, 1, size, file);buffer[size] = '\0';fclose(file);return buffer;
}int main() {const char* filename = "input.json";char* json_str = read_file(filename);if (json_str == NULL) {return 1;}// 解析 JSON 字符串cJSON* root = cJSON_Parse(json_str);if (root == NULL) {const char* error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "Error before: %s\n", error_ptr);}free(json_str);return 1;}// 示例:获取并打印 "name" 字段的值cJSON* name = cJSON_GetObjectItem(root, "name");if (cJSON_IsString(name)) {printf("Name: %s\n", name->valuestring);}// 释放资源free(json_str);cJSON_Delete(root);return 0;
}
2. 生成 JSON 数据并保存到文件
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"int main() {// 创建根 JSON 对象cJSON* root = cJSON_CreateObject();if (root == NULL) {fprintf(stderr, "Failed to create JSON object\n");return 1;}// 添加键值对cJSON_AddStringToObject(root, "name", "John Doe");cJSON_AddNumberToObject(root, "age", 30);// 将 JSON 对象转换为字符串char* json_str = cJSON_Print(root);if (json_str == NULL) {fprintf(stderr, "Failed to print JSON object\n");cJSON_Delete(root);return 1;}// 打开文件以写入模式FILE* file = fopen("output.json", "w");if (file == NULL) {perror("Failed to open file");free(json_str);cJSON_Delete(root);return 1;}// 将 JSON 字符串写入文件fputs(json_str, file);// 关闭文件fclose(file);// 释放内存free(json_str);cJSON_Delete(root);return 0;
}
相关文章:
JSON格式,C语言自己实现,以及直接调用库函数(一)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。以下为你提供不同场景下常见的 JSON 格式示例。 1. 简单对象 JSON 对象是由键值对组成,用花括号 {} 包裹&…...
leetcode刷题第十三天——二叉树Ⅲ
本次刷题顺序是按照卡尔的代码随想录中给出的顺序 翻转二叉树 226. 翻转二叉树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*总体思路就是,对于每一个结点&…...
spring boot知识点5
1.如何你有俩套配置环境,运行时如何选择 如果有俩套配置环境,则需要三个yml application.yml 用于配置你用那个配置环境 application-dev.yml 用于开发配置环境 application-prod.yml 用于发布配置环境 spring:profiles:active: prod # 指定当前激…...
bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全
ETL & 流批一体化框架 bboss v7.3.5 发布,多源输出插件增加为特定输出插件设置记录过滤功能;Elasticsearch 客户端新增异地双中心灾备机制,提升框架高可用性;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...
Android自带的省电模式主要做什么呢?
Android自带的省电模式主要做什么呢? 省电模式支持的策略 LOCATION 灭屏后开启GPS待机省电模式 VIBRATION 关闭触摸震动和来电震动 ANIMATION 关闭动画 FULL_BACKUP 全备份 KEYVALUE_BACKUP 键值备份 NETWORK_FIREWALL 网络防火墙,限制 Doze …...
tp6上传文件大小超过了最大值+验证文件上传大小和格式函数
问题: 最近用tp6的文件上传方法上传文件时报文件过大错误。如下所示: $file $this->request->file(file);{"code": 1,"msg": "上传文件大小超过了最大值!","data": {"code": 1,&q…...
将RocketMQ集成到了Spring Boot项目中,实现站内信功能
1. 添加依赖 首先,在pom.xml中添加RocketMQ的依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifac…...
Spring Boot文件上传
5.3.1文件上传 开发Web应用时,文件上传是很常见的一个需求浏览器通过表单形式将文件以流的形式传递给服务器,服务器再对上传的数据解析处理。下面我们通过一个案例讲解如何使用SpringBoot实现文件上传,具体步骤如下。 1.编写文件上传的表单…...
动态规划算法
动态规划算法模板 public class DynamicProgramming {public int solve(int n, int[] nums) {// Step 1: 初始化 dp 数组,dp[i] 表示从0到i的最优解int[] dp new int[n 1]; // Step 2: 设置初始条件,通常是dp数组的第一个元素dp[0] 0; // 假设从第0个…...
Python中常见库 PyTorch和Pydantic 讲解
PyTorch 简介 PyTorch 是一个开源的深度学习框架,由 Facebook 的 AI 研究团队开发。它提供了丰富的工具和库,用于构建和训练各种深度学习模型,如卷积神经网络(CNN)、循环神经网络(RNN)及其变体&…...
74. 搜索二维矩阵(LeetCode 热题 100)
题目来源; 74. 搜索二维矩阵 - 力扣(LeetCode) 题目内容: 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &am…...
高防服务器的适用场景有哪些?
高防服务器作为具有着较高防御能力的网络设备,可以抵御DDOS和CC等常见的网络攻击类型,保障企业服务的连续性和稳定性,那高防服务器的适用场景有哪些呢? 对于大型的网站和电商平台来说,高流量的用户访问和数据信息让它们…...
HTTP与网络安全
一、HTTPS和HTTP有怎样的区别呢?HTTPS HTTP SSL/TLS(SSL或者TLS) HTTP:应用层 SSL/TLS:协议中间层 TCP:传输层 IP:网络层 HTTPS 是安全的HTTP,他的安全是由SSL或者TLS来决定的&a…...
UE地编材质世界对齐纹理旋转
帖子地址 https://forums.unrealengine.com/t/how-to-rotate-a-world-aligned-texture/32532/4世界对齐纹理本身不能改 自己创建了个函数 把世界对齐纹理的内容赋值粘贴 在纹理偏移里给值 不要局限0-1 给值给大一点...
SpringBoot使用Nacos进行application.yml配置管理
Nacos是阿里巴巴开源的一个微服务配置管理和服务发现的解决方案。它提供了动态服务发现、配置管理和 服务管理平台。Nacos的核心功能包括服务发现、配置管理和动态服务管理,使得微服务架构下的服务治理 变得简单高效。 Nacos的设计基于服务注册与发现、配置管理、动…...
JavaScript中的symbol类型的意义和使用
JavaScript 中的Symbol类型是 ES6(ECMAScript 2015)引入的一种原始数据类型,它表示独一无二的值。下面详细介绍 Symbol 的意义和使用方法。 意义 1. 避免属性名冲突 在 JavaScript 中,对象的属性名通常是字符串。当多个模块或者…...
C++ 设计模式-状态模式
火箭状态模式,涵盖发射、多级分离、入轨、返航、紧急状态等流程,以及状态间的转换逻辑: 状态设计 状态列表: IdleState(待机)PreparingState(准备)LaunchingState(发射中)FirstStageSeparatingState(一级分离)SecondStageSeparatingState(二级分离)ThirdStageSep…...
verilog基础知识
一,Verilog和VHDL区别 全世界高层次数字系统设计领域中,应用Verilog和VHDL的比率是80%和20%;这两种语言都是用于数字电路系统设计的硬件描述语言, 而且都已经是 IEEE 的标准。 VHDL 是美国军方组织开发的,VHDL1987年成为标准;Verilog 是由一个公司的私有财产转化而来,…...
14.8 Auto-GPT 自主智能体设计解密:构建具备长期记忆的智能决策系统
Auto-GPT 自主智能体设计解密:构建具备长期记忆的智能决策系统 关键词:Auto-GPT 架构设计、自主智能体开发、LangChain Agents、长期记忆系统、工具链编排 1. 自主智能体的核心架构设计 Auto-GPT 系统架构图解: #mermaid-svg-NuDU1eo6sXqhA6Ve {font-family:"trebuch…...
ubuntu安装docker docker/DockerHub 国内镜像源/加速列表【持续更新】
ubuntu安装docker & docker镜像代理【持续更新】 在Ubuntu上安装Docker,你可以选择两种主要方法:从Ubuntu的仓库安装,或者使用Docker的官方仓库安装。下面我会详细解释这两种方法。 方法一:从Ubuntu的仓库安装Docker 这种方…...
模拟实现分布式文件存储
Q1:如何解决海量数据存的下的问题 传统做法是在单机存储。但是随着数据变多,会遇到存储瓶颈。 单机纵向扩展:内存不够加内存,磁盘不够加磁盘。有上限限制,不能无限制加下去。 多机横向扩展:采用多台机器存储&#x…...
HW面试经验分享 | 北京蓝中研判岗
目录: 所面试的公司介绍 面试官的问题: 1、面试官先就是很常态化的让我做了一个自我介绍 2、自我介绍不错,听你讲熟悉TOP10漏洞,可以讲下自己熟悉哪些方面吗? 3、sql注入原理可以讲下吗? 4、sql注入绕WAF有…...
HarmonyOS学习第3天: 环境搭建开启鸿蒙开发新世界
一、引言 在数字化时代,操作系统作为连接用户与硬件设备的桥梁,其重要性不言而喻。HarmonyOS 作为华为公司推出的面向全场景的分布式操作系统,以其创新的理念和卓越的性能,正逐渐在全球范围内崭露头角。它打破了设备之间的界限&a…...
基于STM32与BD623x的电机控制实战——从零搭建无人机/机器人驱动系统
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、为什么选择这两个芯片?1.1 STM32微控制器1.2 ROHM BD623x电机驱动 二、核心控制原理详解2.1 H桥驱动奥…...
【react18】如何使用useReducer和useContext来实现一个todoList功能
重点知识点就是使用useReducer来攻坚小型的公共状态管理,useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…...
Java多线程三:补充知识
精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Lambda表达式 简介: 希腊字母表中排序第十一位的字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式编程的概念 为什么要使用lam…...
go WEB框架
推荐选型 https://chat.deepseek.com/a/chat/s/e6061607-8f33-4768-a5f0-8970cb1ffefd echo github:https://github.com/labstack/echo wiki:https://echo.labstack.com/docs/quick-start block:https://blog.csdn.net/qq_38105536/artic…...
【Python爬虫(27)】探索数据可视化的魔法世界
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
渲染 101 支持 3ds Max 的渲染器及其优势
在 3ds Max 创作流程里,渲染环节对最终成果的呈现效果起着决定性作用,渲染 101 云渲染平台则为 3ds Max 用户提供了全面且高效的渲染解决方案。 支持的渲染器 V-Ray 渲染器 在 3ds Max 中应用广泛,具备全局光照、光线追踪技术,…...
在 Java 中使用 `if` 语句实现双重判定
关于在 Java 中使用 if 语句实现双重判定,并使用 Eclipse 和 JUnit4 进行单元测试的详细介绍: --- ### 一、双重判定的实现 **双重判定**指在 if 语句中通过逻辑运算符组合两个条件。常用方式: - **逻辑与 &&**:两个条件…...
Ollama 安装
Ollama 支持多种操作系统,包括 macOS、Windows、Linux 以及通过 Docker 容器运行。 Ollama 对硬件要求不高,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 CPU:多核处理器(推荐 4 核或以上)。GPU…...
Docker Swarm 内置的集群编排
在现代容器化应用中,容器编排(Container Orchestration)是至关重要的,它负责自动化容器的部署、扩展、负载均衡和管理。Docker Swarm 是 Docker 提供的原生集群管理和容器编排工具,允许用户通过 Docker CLI 在多个 Doc…...
AF3 _build_query_to_hit_index_mapping函数解读
AlphaFold3 中templates模块的_build_query_to_hit_index_mapping函数是将原始查询序列(original_query_sequence)中的索引与hit 序列(hit_sequence)中的索引进行映射。 在蛋白质序列比对(如 HHsearch)中,hit 是与查询序列部分匹配的区域。由于存在缺口(-)和部分比对…...
Windows 中的启动项如何打开?管理电脑启动程序的三种方法
在日常使用电脑时,我们经常会发现一些应用程序在开机时自动启动,这不仅会拖慢系统的启动速度,还可能占用不必要的系统资源。幸运的是,通过几个简单的步骤,你可以轻松管理这些开机自启的应用程序。接下来,我…...
科普:“git“与“github“
Git与GitHub的关系可以理解为:Git是一种软件工具,而GitHub则是一个在线平台,它们是“一家子”。二者的关联最直接体现在你通过Git在GitHub仓库中clone软件包到你的机器中来。 具体来说: 一、Git 定义:Git是一个开源的…...
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试: python -c"import cv2"...
国产编辑器EverEdit - 语法着色及嵌入式多语言着色
1 文档-着色及语法相关 1.1 应用场景 在编辑代码文件或脚本文件过程中,如果对语法着色、模式等文件进行了修改,需要立即生效时,可以通过文档-高级功能下的重新加载功能,立即生效相关配置。 1.2 使用方法 1.2.1 重新加载着色 着…...
设计模式教程:解释器模式(Interpreter Pattern)
1. 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为型设计模式,通常用于处理语言(例如数学表达式、SQL查询等)中的语法和解释。该模式定义了一个文法,并通过解释器类来解释文法中…...
Three.js 快速入门教程【六】相机控件 OrbitControls
系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...
【git】合并多个提交记录
1.说明 有时候因为某些小修改会导致代码多了很多不必要的提交,如果希望合并这些commit记录,我们可以使用rebase或者reset命令完成合并 2.rebase 这种方式是通过变基操作完成的,它适用于已经push到远程的情况,当我们变基好了之后…...
题海拾贝:【枚举】P2010 [NOIP 2016 普及组] 回文日期
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞,关注! 1、题…...
SQL Server 链接服务器 MySQL 详细步骤
目录 前言 一、准备工作 1. 确认需求 2. 获取权限 二、安装必要的驱动程序和工具 1.下载并安装MySQL ODBC驱动: 2.安装 SQL Server 和 MySQL 的管理工具: 三、配置 SQL Server 以连接到MySQL 1.执行创建链接服务器的T-SQL语句: 2.配…...
Java集合框架之List接口详解
目录 一、List接口概述 二、List接口常见实现类 三、List接口特有方法: 1.元素操作 2. 查找元素位置 3. 子列表与不可变列表 四、List特有迭代器:ListIterator 1.特有的迭代方式 2.ListIterator接口中的常用方法: ⑴.void add(E e):在光标位置插入元素。(会移动…...
【大语言模型_4】源码编译vllm框架cpu版
背景: 通过官方提供的pip install vllm安装的vllm框架不支持cpu加载模型。因此需要本地编译。 系统环境 操作系统:欧拉2203 python版本:3.10 编译步骤 一、安装gcc/g/cmake 1、下载源码:https://github.com/vllm-project/vllm 安…...
城市地质安全专题连载⑦ | 加强国土空间规划管控,规避城市地质安全风险
作者 | 徐海洋 在国土空间规划中,地质调查扮演着先导性和基础性的角色。它如同一把无形的尺子,衡量着每一寸土地的开发潜力与安全边界,不仅为城市规划提供了科学依据,还在规避地质安全风险、优化资源配置方面发挥着关键作用。然而…...
Go入门之函数
func subn1(x, y int) int {sub : x - yreturn sub } 函数参数简写,可以省略前边的,和后边的类型一样 func addn1(x ...int) int {sum : 0for _, v : range x {sum v}return sum } 求可变参数的核,表示传参的个数不确定 func addn1(x int…...
前端如何把SEO优化做到极致✅
在前端🚀如何把SEO优化做到极致✅ SEO 是 Search Engine Optimization 的缩写,即搜索引擎优化。它是一种通过调整网站的内容、结构、外部链接等方面的优化手段,来提高网站在搜索引擎中的自然排名,以求得获得更多的流量࿰…...
【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型
线程同步 条件变量 当一个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如:一个线程访问队列时,发现队列为空,它只能等待,直到其它线程将一个节点添加到队列中。这…...
Openssl交叉编译
在 OpenSSL 交叉编译中,linux-aarch64是一个用于指定目标平台的配置选项,表示目标是 X86 架构的 64位系统。这个选项可以从 OpenSSL 的 ./Configure 命令支持的平台列表中获取。 你可以通过运行以下命令查看 OpenSSL 支持的所有平台配置选项:…...
基于Ubuntu系统的docker环境对MySQL8.0.36主从部署
1. 环境准备 1、1 前言 本文基于Ubuntu系统的docker环境对MySQL8.0.36进行2台物理服务器的主从部署。1.2 服务器硬件环境准备 准备2台物理服务器192.168.8.6 和 192.168.8.9。 2台物理服务器在同一个局域网环境下,可以相互网络通信。 服务器操作系统版本:Ubuntu 24.04.1 L…...