通讯录(C语言)

通讯录

  • 一、基本思路及功能介绍
  • 二、功能实现
    • 1.基础菜单的实现
    • 2.添加联系人信息功能实现
    • 3.显示联系人信息功能实现
    • 4.删除联系人信息功能实现
    • 5.查找联系人信息功能实现
    • 6.修改联系人信息功能实现
    • 7.排序联系人信息功能实现
    • 8.加载和保存联系人信息功能实现
  • 三、源文件展示
    • 1.test.c
    • 2.contact.c
    • 3.contact.h

一、基本思路及功能介绍

想要用C语言实现通讯录的功能,基本上涵概了C语言入门的一些知识运用,如:指针、结构体、文件操作、动态内存管理等相关的知识;

实现一个简单的通讯录的基本功能:

    1.添加联系人信息;2.删除联系人信息;3.查找联系人信息;4.修改联系人信息;5.显示联系人信息;6.排序联系人信息;   7.保存联系人信息;8.退出通讯录;

二、功能实现

1.基础菜单的实现

void menu()
{printf("\t\t\t\t************************************\n");printf("\t\t\t\t******    通讯录管理系统    ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t*      1.添加联系人       *\n");printf("\t\t\t\t*      2.删除联系人       *\n");printf("\t\t\t\t*      3.查找联系人	      *\n");printf("\t\t\t\t*      4.修改联系人       *\n");printf("\t\t\t\t*      5.显示联系人       *\n");printf("\t\t\t\t*      6.排序联系人       *\n");printf("\t\t\t\t*      0.退出通讯录       *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n");
}
enum
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;struct Contact con;InitContact(&con);//初始化通讯录do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加联系人信息break;case DEL:DelContact(&con);//删除联系人信息break;case SEARCH:SearchContact(&con);//查找联系人信息break;case MODIFY:ModifyContact(&con);//修改联系人信息break;case SHOW:ShowContact(&con);//显示联系人信息break;case SORT:SortContact(&con);//排序联系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//销毁通讯录信息printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

2.添加联系人信息功能实现

//扩充容量
void CheckContact(struct Contact* pc)
{if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("扩容成功\n");}else{printf("扩容失败\n");exit(1);}}
}//初始化通讯录
void InitContact(struct Contact* pc)
{pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;
}//添加联系人信息
void AddContact(struct Contact* pc)
{CheckContact(pc);printf("请输入联系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("请输入联系人的年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入联系人的性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入联系人的电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入联系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++;
}

3.显示联系人信息功能实现

 
//显示联系人信息
void ShowContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,显示失败!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");
}

4.删除联系人信息功能实现

 
//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("联系人为空,操作失败\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的联系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}

5.查找联系人信息功能实现

//查找联系人信息
void SearchContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要查找的联系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}

6.修改联系人信息功能实现

//修改联系人信息
void ModifyContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("请输入新的联系人姓名:>");scanf("%s", pc->data[pos].name);printf("请输入新的联系人年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入新的联系人性别:>");scanf("%s", pc->data[pos].sex);printf("请输入新的联系人电话:>");scanf("%s", pc->data[pos].tele);printf("请输入新的联系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n");
}

7.排序联系人信息功能实现

//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}

8.加载和保存联系人信息功能实现

//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}//保存信息
void SaveContact(struct Contact* pc)
{//1.打开文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.关闭文件fclose(pf);pf = NULL;
}

三、源文件展示

1.test.c

void menu()
{printf("\t\t\t\t************************************\n");printf("\t\t\t\t******    通讯录管理系统    ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t*      1.添加联系人       *\n");printf("\t\t\t\t*      2.删除联系人       *\n");printf("\t\t\t\t*      3.查找联系人	      *\n");printf("\t\t\t\t*      4.修改联系人       *\n");printf("\t\t\t\t*      5.显示联系人       *\n");printf("\t\t\t\t*      6.排序联系人       *\n");printf("\t\t\t\t*      0.退出通讯录       *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n");
}
enum
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;struct Contact con;InitContact(&con);//初始化通讯录do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加联系人信息break;case DEL:DelContact(&con);//删除联系人信息break;case SEARCH:SearchContact(&con);//查找联系人信息break;case MODIFY:ModifyContact(&con);//修改联系人信息break;case SHOW:ShowContact(&con);//显示联系人信息break;case SORT:SortContact(&con);//排序联系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//销毁通讯录信息printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

2.contact.c

#include "contact.h"//扩充容量
void CheckContact(struct Contact* pc)
{if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("扩容成功\n");}else{printf("扩容失败\n");exit(1);}}
}//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}//初始化通讯录
void InitContact(struct Contact* pc)
{pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;LoadContact(pc);//加载有效信息到通讯录中
}//添加联系人信息
void AddContact(struct Contact* pc)
{CheckContact(pc);printf("请输入联系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("请输入联系人的年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入联系人的性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入联系人的电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入联系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++;
}//销毁通讯录
void DistroyContact(struct Contact* pc)
{free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}//显示联系人信息
void ShowContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,显示失败!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");
}//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("联系人为空,操作失败\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的联系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}//查找联系人信息
void SearchContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要查找的联系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}//修改联系人信息
void ModifyContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("请输入新的联系人姓名:>");scanf("%s", pc->data[pos].name);printf("请输入新的联系人年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入新的联系人性别:>");scanf("%s", pc->data[pos].sex);printf("请输入新的联系人电话:>");scanf("%s", pc->data[pos].tele);printf("请输入新的联系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n");
}//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}//保存信息
void SaveContact(struct Contact* pc)
{//1.打开文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.关闭文件fclose(pf);pf = NULL;
}

3.contact.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 20
#define DEFAULT_SZ 3struct PeoInfo
{char name[NAME_MAX];//姓名int age;			//年龄char sex[SEX_MAX];  //性别char tele[TELE_MAX];//电话char addr[ADDR_MAX];//住址
};struct Contact
{struct PeoInfo* data;//能够动态存储联系人的信息int sz;				 //记录当前联系人的个数int capacity;		 //记录当前通讯录的容量
};//初始化通讯录
void InitContact(struct Contact* pc);//添加联系人信息
void AddContact(struct Contact* pc);//销毁通讯录信息
void DistroyContact(struct Contact* pc);//显示联系人信息
void ShowContact(struct Contact* pc);//删除联系人信息
void DelContact(struct Contact* pc);//查找联系人信息
void SearchContact(struct Contact* pc);//修改联系人信息
void ModifyContact(struct Contact* pc);//排序联系人信息
void SortContact(struct Contact* pc);//加载有效信息到通讯录中
void LoadContact(struct Contact* pc);//保存信息
void SaveContact(struct Contact* pc);

#四、演示效果

没有联系人
在这里插入图片描述

存入联系人
在这里插入图片描述

查找联系人
在这里插入图片描述

修改联系人
在这里插入图片描述

显示联系人
加粗样式

排序联系人
在这里插入图片描述

退出通讯录
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/108590.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB图论合集(三)Dijkstra算法计算最短路径

本贴介绍最短路径的计算&#xff0c;实现方式为迪杰斯特拉算法&#xff1b;对于弗洛伊德算法&#xff0c;区别在于计算了所有结点之间的最短路径&#xff0c;考虑到MATLAB计算的便捷性&#xff0c;计算时只需要反复使用迪杰斯特拉即可&#xff0c;暂不介绍弗洛伊德的实现&#…

ChatGPT 与前端技术实现制作大屏可视化

像这样的综合案例实分析,我们可以提供案例,维度与指标数据,让ChatGPT与AIGC 帮写出完整代码,并进行一个2行2列的布局设置。 数据与指令如下: 商品名称 销量 目标 完成率 可乐 479 600 79.83% 雪碧 324 600 54.00% 红茶 379 600 63.…

Unity报错DllNotFoundException:sqlite3

Unity项目中要使用轻型数据库sqlite&#xff0c;除了导入sqlite3.dll外&#xff0c;还需要导入Mono.Data.Sqlite.dll和System.Data.dll&#xff08;工程里或者编辑器里面有System.Data.dll时就不需要&#xff09;两个文件。 如果在编辑器中运行出现 “DllNotFoundException:sql…

优化器调整策略

损失函数的作用是衡量模型输出与真实标签的差异。当我们有了这个loss之后&#xff0c;我们就可以通过反向传播机制得到参数的梯度&#xff0c;那么我们如何利用这个梯度进行更新参数使得模型的loss逐渐的降低呢&#xff1f; 优化器的作用 Pytorch的优化器&#xff1a; 管理并…

nacos总结1

5.Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 5.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c…

windows可视化界面管理服务器上的env文件

需求&#xff1a;在 Windows 环境中通过可视化界面编辑位于 Linux 主机上的 env 文件的情况&#xff0c;我现在环境是windows环境&#xff0c;我的env文件在linux的192.168.20.124上&#xff0c;用户是op&#xff0c;密码是op&#xff0c;文件绝对路径是/home/op/compose/env …

CTFhub-sqli注入-报错注入

用到的函数 updatexml(1&#xff0c; &#xff0c;1) concat(0x7e, ,0x7e) group_concat(目标值) right(&#xff0c;32) 1 1 1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 1 union select updatexml(1,concat(0x7e,(select(group_concat(ta…

TensorBoard的使用

TensorBoard&#xff1a;对图像进行变换 1. SummaryWriter的使用 ctrl类出现注释解析&#xff1a; 将条目直接log_dir写入要成为由TensorBoard使用。 “摘要编写器”类提供了一个高级 API 来创建事件文件&#xff0c;并在给定目录中添加摘要和事件。该类更新文件内容异步。…

leetcode.105 从前序和中序遍历序列构造二叉树

题目描述&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一 棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 题目要求&#xff1a; 1 < preorder.length < 3000inorder.length…

【论文阅读】自动驾驶安全的研究现状与挑战

文章目录 术语解释摘要1.引言1.1.自动驾驶安全1.2.攻击面1.3.内容和路线图 2.自动驾驶技术2.1.组成2.2.技术 3.传感器安全3.1.照相机3.2.GNSS&#xff08;全球导航系统&#xff09;/IMU&#xff08;惯性测量单元&#xff09;3.3.超声波传感器3.4.毫米波雷达3.5.激光雷达3.6.多传…

Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) A ~ D

比赛链接 A 正常枚举就行&#xff0c;从最后一位往前枚举&#xff0c;-1、-2、-3...这样 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typedef long l…

使用windeployqt和InstallShield打包发布Qt软件的流程

前言 Qt编译之后需要打包发布&#xff0c;并且发布给用户后需要增加一个安装软件&#xff0c;通过安装软件可以实现Qt软件的安装&#xff1b;用于安装软件的软件有很多&#xff0c;这里主要介绍InstallShield使用的流程&#xff1b; 使用windeployqt打包Qt编译后的程序 Qt程序…

手写数字识别之损失函数

目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解&#xff1a;真实分布与非真实分布的交叉&#xff0c;完全对应&#xff0c;熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…

LeetCode-56-合并区间

题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 可以使用 LinkedList&#xff0c;…

利用 IDEA IDE 的轻量编辑模式快速查看和编辑工程外的文本文件

作为程序员, 我们都知道 IDE 的很好用的, 它的文本编辑器功能也非常的强大, 用起来非常便捷. 在长年累月的使用中, 我们也变得对其非常熟悉, 以致于使用起其它简单地轻量级的文本编辑器来, 比如什么记事本, Notepad, UltraEdit 等等呀, 觉得既不方便又不熟悉. 关键是很多的操作…

原生微信小程序 动态(横向,纵向)公告(广告)栏

先看一下动态效果 Y轴滚动公告的原理是swiper组件在页面中的Y轴滚动&#xff0c;属性vertical&#xff0c;其余属性也设置一下autoplay circular interval"3000" X轴滚动的原理是&#xff0c;利用动画效果&#xff0c;将内容从右往左过渡过去 wxml&#xff1a; &l…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

http协议与apache

http概念&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网&#xff1a;万维网并非某种特殊的计算机网络&#xff0c;是一个大规模的、联机式的信息贮藏库&…

Redis基础知识

Redis基础知识 redis共有16个数据库&#xff0c;默认使用的是第0个 可以使用select进行切换数据库 # 切换数据库 127.0.0.1:6379> select 1 OK # 查看DB大小 127.0.0.1:6379[1]> DBSIZE (integer) 0查看当前数据库所有的key 127.0.0.1:6379> keys * #查看当前数据…

Sketch 98 中文版-mac矢量绘图设计

Sketch是一款专为Mac操作系统设计的矢量图形编辑软件&#xff0c;被广泛应用于UI/UX设计、网页设计、移动应用设计等领域。Sketch提供了各种工具和功能&#xff0c;包括绘图、图形设计、排版等&#xff0c;可以帮助设计师轻松地创建高质量的矢量图形和模型。Sketch的主要特点包…