当前位置: 首页 > news >正文

C语言之通讯录的实现

在这里插入图片描述

通讯录实现所需头文件和源文件

Contact.h的功能

声明函数和创建结构体变量

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_PHONE 12
#define MAX_ADDRESS 30
#define DEFAULT_SZ 3
#define INTC_SZ 2
typedef struct PeoInform
{char name[MAX_NAME];int age;char sex[MAX_SEX];char phone[MAX_PHONE];char address[MAX_ADDRESS];
}PeoInform;//静态
//typedef struct Contact
//{
//    PeoInform data[MAX];
//    int size;
//    
//}Contact;typedef struct Contact
{PeoInform* data;int size;int capacity;
}Contact;void InitContact(Contact* pc);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact(const Contact* pc);
void MoidfyContact(Contact* pc);
void SortContact(Contact* pc);
void  DerstoryContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadCntact(Contact* pc);

Contact.c

设定通讯录所需的功能和函数的定义

void InitContact(Contact* pc);//初始化函数
void AddContact(Contact* pc);//增加用户
void ShowContact(const Contact* pc);//显示通讯录信息·
void DelContact(Contact* pc);//删除用户信息
void SearchContact(const Contact* pc);//搜索通讯录
void MoidfyContact(Contact* pc);//修改用户信息
void SortContact(Contact* pc);//排序通讯录
void DerstoryContact(Contact* pc);//因动态申请内存所以释放内存
void SaveContact(Contact* pc);//通讯录信息保存到文件
void LoadCntact(Contact* pc);//把文件保存到通讯录中

void InitContact(Contact* pc);

void InitContact(Contact* pc)
{//动态版memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址pc->size = 0;pc->capacity = DEFAULT_SZ;PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;//加载文件信息到通讯录//LoadContact(pc);
}

void AddContact(Contact* pc);

void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);pc->size++;printf("添加成功\n");
}

``

void ShowContact(const Contact* pc);

	void ShowContact(const Contact * pc){if (pc->size == 0){printf("通讯录为空\n");}else{int i = 0;printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->size; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].phone,pc->data[i].address);}}}

void DelContact(Contact* pc);

static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{int i = 0;for (int i = 0; i < pc->size; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}return -1;
}void DelContact(Contact* pc)
{char name[MAX_NAME];printf("请输入要删除人的名字>");scanf("%s", name);int pos = FindByName(pc,name);if (pos == -1){printf("查询不到联系人\n");}else{int j = 0;for (j = pos; j < pc->size; j++);}
}

void SearchContact(const Contact* pc);

static int FindByName(const Contact* pc, char name[MAX_NAME])//用于函数内部所以设置为静态
{int i = 0;for (int i = 0; i < pc->size; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}return -1;
}
void SearchContact(const Contact* pc)
{char name[MAX_NAME];printf("请输入查找人的名字\n");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找人不存在\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].phone,pc->data[pos].address);}
}

void MoidfyContact(Contact* pc);

void MoidfyContact(Contact* pc)
{char name[MAX_NAME];printf("请输入修改联系人的名字>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要修改人的名字");}else{printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);printf("修改完成\n");}
}

void SortContact(Contact* pc);

	void SortContact(Contact* pc){if (pc->size == 0){printf("通讯录没有联系人,请添加\n");}for (int i = 0; i < pc->size-1; i++){for (int j = 0; j < pc->size - 1 - i; j++){if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0){PeoInform tmp;tmp = pc->data[j];pc -> data[j] = pc->data[j+1];pc->data[j+1] = tmp;}}printf("排序成功\n");}}

void DerstoryContact(Contact* pc);

void  DerstoryContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->size = 0;pc = NULL;
}

void SaveContact(Contact* pc);

void SaveContact(Contact* pc)//保存文件信息{FILE * pf = fopen("contact.txt", "wb");// 为了输出数据,打开一个二进制文件if (NULL == pf){perror("SaveContact");//打开失败就不用关闭文件了}else{int i = 0;for (i = 0; i < pc->size; i++){/fwrite(pc->data + i, sizeof(PeoInform), 1, pf);//1.结构体地址,一个元素占多少字节,多少个元素,写到pf这个文件}//一次写一个到pf所指文件fclose(pf);pf = NULL;printf("保存成功\n");}}

void LoadCntact(Contact* pc);

	void LoadContact(Contact* pc){//把文件的内容放在通讯录中FILE* pf = fopen("contact.txt","rb"); //为了输入数据,打开一个二进制文件if (pf == NULL){perror("LoadContact");}else//读数据{PeoInform tmp = { 0 };int i = 0;//正常读到1返回1 没读到返0while (fread(&tmp, sizeof(PeoInform), 1, pf))//{check_capacity(pc);pc->data[i] = tmp;pc->size++;i++;}}fclose(pf);pf = NULL;}

contact.c的综合实现

#include "Contact.h"
void check_capacity(Contact* pc)
{if (pc->size = pc->capacity){PeoInform* str = (PeoInform*)realloc(pc->data, (pc->capacity + INTC_SZ) * sizeof(PeoInform));if (str == NULL){perror("check_capacity::realloc");return;}pc->data = str;pc->capacity += INTC_SZ;printf("增容成功");}
}//静态
//void InitContact(Contact* pc)
//{
//	memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址
//	pc->size = 0;
//}//动态
void InitContact(Contact* pc)
{memset(pc->data, 0, sizeof(pc->data));//第一个参数是起始地址pc->size = 0;pc->capacity = DEFAULT_SZ;PeoInform* ptr= (PeoInform*)calloc(DEFAULT_SZ,sizeof(PeoInform));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;//加载文件信息到通讯录//LoadContact(pc);
}void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);pc->size++;printf("添加成功\n");
}static int FindByName(const Contact* pc, char name[MAX_NAME])
{int i = 0;for (int i = 0; i < pc->size; i++){if (0 == strcmp(pc->data[i].name, name)){return i;}}return -1;
}void DelContact(Contact* pc)
{char name[MAX_NAME];printf("请输入要删除人的名字>");scanf("%s", name);int pos = FindByName(pc,name);if (pos == -1){printf("查询不到联系人\n");}else{int j = 0;for (j = pos; j < pc->size; j++);}
}void SearchContact(const Contact* pc)
{char name[MAX_NAME];printf("请输入查找人的名字\n");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找人不存在\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].phone,pc->data[pos].address);}
}void MoidfyContact(Contact* pc)
{char name[MAX_NAME];printf("请输入修改联系人的名字>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要修改人的名字");}else{printf("请输入名字\n");scanf("%s", pc->data[pc->size].name);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->size].age));printf("请输入性别\n");scanf("%s", pc->data[pc->size].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->size].phone);printf("请输入地址\n");scanf("%s", pc->data[pc->size].address);printf("修改完成\n");}
}void ShowContact(const Contact * pc){if (pc->size == 0){printf("通讯录为空\n");}else{int i = 0;printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->size; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].phone,pc->data[i].address);}}}void SortContact(Contact* pc){if (pc->size == 0){printf("通讯录没有联系人,请添加\n");}for (int i = 0; i < pc->size-1; i++){for (int j = 0; j < pc->size - 1 - i; j++){if (strcmp((pc->data[j].name), (pc->data[j + 1].name) )> 0){PeoInform tmp;tmp = pc->data[j];pc -> data[j] = pc->data[j+1];pc->data[j+1] = tmp;}}printf("排序成功\n");}}void  DerstoryContact(Contact* pc){free(pc->data);pc->data = NULL;pc->capacity = 0;pc->size = 0;pc = NULL;}void SaveContact(Contact* pc){FILE * pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{int i = 0;for (i = 0; i < pc->size; i++){fwrite(pc->data + i, sizeof(PeoInform), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}}void LoadContact(Contact* pc){FILE* pf = fopen("contact.txt","rb"); if (pf == NULL){perror("LoadContact");}else{PeoInform tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInform), 1, pf)){check_capacity(pc);pc->data[i] = tmp;pc->size++;i++;}}fclose(pf);pf = NULL;}

test.h

#include "Contact.h"void menu()
{printf("*********************************\n");printf("**      1. 添加联系人          **\n");printf("**      2. 删除联系人          **\n");printf("**      3. 查找联系人          **\n");printf("**      4. 修改联系人          **\n");printf("**      5. 显示所有联系人      **\n");printf("**      6. 按姓名排序联系人    **\n");printf("**      0. exit                **\n");printf("*********************************\n");
}
void test()
{int input = 0;Contact con;InitContact(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2: DelContact(&con);break;case 3:SearchContact(&con);break;case 4:MoidfyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;case 0:DerstoryContact(&con);printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);
}
int main()
{test();return 0;
}

在这里插入图片描述

相关文章:

C语言之通讯录的实现

通讯录实现所需头文件和源文件 Contact.h的功能 声明函数和创建结构体变量 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #define MAX 1000 #define MAX_NAME 20 #define MAX…...

手把手教大家在 gRPC 中使用 JWT 完成身份校验

文章目录1. JWT 介绍1.1 无状态登录1.1.1 什么是有状态1.1.2 什么是无状态1.2 如何实现无状态1.3 JWT1.3.1 简介1.3.2 JWT数据格式1.3.3 JWT 交互流程1.3.4 JWT 存在的问题2. 实践2.1 项目创建2.2 grpc_api2.3 grpc_server2.4 grpc_client3. 小结上篇文章松哥和小伙伴们聊了在 …...

VSCode远程连接服务器

工作使用服务器的jupyter&#xff0c;直到有一天服务器挂了&#xff0c;然而&#xff0c;代码还没有来得及备份。o(╥﹏╥)o VScode远程连接服务器&#xff0c;使用服务器的资源&#xff0c;代码可以存在本地&#xff0c;可以解决上述困境。 1.官网下载VSCode.网址https://cod…...

【C++】-- 异常

目录 C语言传统的处理错误的方式 C异常概念 异常的使用 异常的抛出和捕获 自定义异常体系 异常的重新抛出 异常安全 异常规范&#xff08;C期望&#xff09; C标准库的异常体系 异常的优缺点 C异常的优点 C异常的缺点 总结 C语言传统的处理错误的方式 传统的错误…...

Java中的Stack与Queue

文章目录一、栈的概念及使用1.1 概念1.2 栈的使用1.3 栈的模拟实现二、队列的概念及使用2.1 概念2.2 队列的使用2.3 双端队列(Deque)三、相关OJ题3.1 用队列实现栈。3.2 用栈实现队列。总结一、栈的概念及使用 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在…...

xilinx FPGA在线调试方法总结(vivado+ila+vio)

本文主要介绍xilinx FPGA开发过程中常用的调试方法&#xff0c;包括ILA、VIO和TCL命令等等&#xff0c;详细介绍了如何使用。一、FPGA调试基本原则根据实际的输出结果表现&#xff0c;来推测可能的原因&#xff0c;再在模块中加ILA信号&#xff0c;设置抓信号条件&#xff0c;逐…...

自动化测试——css元素定位

文章目录一、css定位场景二、css相对定位的优点三、css的调试方法1、表达式中含有字符串&#xff1a;表达式中的引号一定和外面字符串的引号相反四、css基础语法1、标签定位2、class定位特别注意&#xff1a;当class类型的属性值包含多个分割值&#xff0c;$(.s_tab s_tab_1z9n…...

ChatGPT可能马上取代你,这是它能做的十个工作

ChatGPT 的横空出世,在业界掀起了惊涛骇浪。专家表示,ChatGPT 和相关人工智能技术可能会威胁到一些工作岗位,尤其是白领工作。 自去年11月发布以来,新型聊天机器人模型 ChatGPT 已经被用于各种各样的工作:撰写求职信、编写儿童读物,甚至帮助学生在论文中作弊。谷歌公司发…...

ubuntu转储coredump

方法一&#xff1a; 输入以下命令即可,其中${USER}为自己电脑的用户名&#xff1a; ulimit -c unlimited echo "/home/${USER}/core.%p" > /proc/sys/kernel/core_pattern 方法二&#xff1a; Disable apport : sudo systemctl stop apport.servicesudo system…...

基于单片机的毕业设计推荐

** 2023基于单片机的毕业设计推荐&#xff1a; ** 1、基于51单片机的多功能门禁系统&#xff08;低端、功能限制较大&#xff09;。 2、基于单片机的多功能实时时钟。 3、基于单片机的音乐播放器。 4、基于STM32单片机的多功能门禁系统&#xff08;高端、没有限制&#xff09…...

APP测试中ios和androis的区别,有哪些注意点

目录 一、运行机制不同 二、对app内存消耗处理方式不同 三、后台制度不同 四、最高权限指令不同 五、推送机制不同 六、抓取方式不同 七、灰度发版机制不同 八、审核机制不同 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;…...

使用 Xcode 创建第一个 Objective-C 命令行程序 HelloWorld

总目录 iOS开发笔记目录 从一无所知到入门 文章目录创建项目运行项目&#xff0c;查看日志输出同一项目下新增子目录&#xff0c;切换要运行的 Target创建项目 打开 Xcode &#xff0c;Create a new Xcode project 接下来的默认界面&#xff1a; 切换到 macOS 下&#xff…...

【蓝桥杯集训8】哈希表专题(3 / 3)

目录 手写哈希表 1、开放寻址法 2、拉链法 字符串前缀哈希表法 2058. 笨拙的手指 - 哈希表 秦九韶算法&#xff08;进制转换&#xff09; 枚举 秦九韶算法——将x进制数转化为十进制数 手写哈希表 活动 - AcWing 1、开放寻址法 设 h(x)k&#xff0c;也就是 x 的哈希值…...

Java Scanner 类,超详细整理,适合新手入门

目录 一、什么是 Java Scanner 类&#xff1f; 二、引用数据类型 1、引用数据类型的定义 三、Scanner 类有哪些常用方法&#xff1f; hasNext()用法 四、next() 与 nextLine() 区别 next(): nextLine()&#xff1a; 五、使用 next 方法 五、使用 nextLine方法 一、什…...

干货 | 中小企业选型 Elasticsearch 避坑指南

1、线上常见问题在我线下对接企业或线上交流的时候&#xff0c;经常会遇到各种业务场景不同的问题。比如&#xff0c;常见问题归类如下&#xff1a;常见问题1&#xff1a;ES 适合场景及架构选型问题。公司的核心业务是做企业员工健康管理&#xff0c;数据来自电子化后的员工体检…...

全局组件和局部组件

全局组件第一种定义方法&#xff1a;A、创建自己的组件&#xff1a;Loading.vueB、在main.js文件中引入组件并注册import Vue from vue import App from ./App.vue import * as filters from ./filterimport quanjuzujian from ./components/quanjuzujian.vueVue.component(qua…...

提取括号中的内容

正则能解决不嵌套的括号内容提取问题遇到一个问题&#xff0c;就是需要提取字符串中每一个中括号里的内容&#xff0c;在网上搜了一下&#xff0c;发现用正则表达式(\[[^\]]*\])可以提取中括号中的内容&#xff0c;以下面文本为匹配对象&#xff1a;PerformanceManager[第1个中…...

数据结构-算法的空间复杂度(1.2)

目录 1.空间复杂度 1.1 例子 1.2 空间的特殊性质 写在最后&#xff1a; 1.空间复杂度 空间复杂度也是一个数学表达式&#xff0c; 是对一个算法在运行过程中临时占用存储空间大小的量度。 他也是用大O渐进表示法。 1.1 例子 例1&#xff1a; 冒泡排序&#xff1a; v…...

【总结】python3启动web服务引发的一系列问题

背景 在某行的实施项目&#xff0c;需要使用python3环境运行某些py脚本。 由于行内交付的机器已自带python3 &#xff0c;没有采取自行安装python3&#xff0c;但是运行python脚本时报没有tornado module。 错误信息 ModuleNotFoundError&#xff1a;No module named ‘torn…...

Linux:基于libevent读写管道代码,改进一下上一篇变成可以接收键盘输入

对上一篇进行改进&#xff0c;变成可以接收键盘输入&#xff0c;然后写入管道&#xff1a; 读端代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...