通讯录实现

通讯录

静态版本

通讯录在我们日常生活中常见,它可以帮助我们记录信息那我们今天就来实现一下通讯录。
首先我们需要定义两个.c文件和一个.h文件
在这里插入图片描述
contact.h
声明和一些定义
contact.c
实现程序
main.c
主函数
需要在两个.c文件中包含"contact.h"
我们再来打印一个菜单,可以让我们选择操作

void menu()
{
	printf("************************\n");
	printf("***  1.Add  2.Del    ***\n");
	printf("***  3.Search        ***\n");
	printf("***  4.Mod  5.Show   ***\n");
	printf("***  6.Sore 0.Exit   ***\n");
	printf("************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case Exit:
			printf("退出通讯录\n");
			break;
		case Add:
		case Del:
		case Search:
		case Mod:
		case Show:
		case Sore:
		default :
			printf("选择错误\n");
		}
	} while (input);
	return 0;
}

那么我们要录入信息,就先创建信息

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define Max 100
#define Max_name 20
#define Max_sex 8
#define Max_tele 12
#define Max_addr 20
 typedef struct Peoinfo
{
	char name[Max_name];
	int age;
	char sex[Max_sex];
	char tele[Max_tele];
	char addr[Max_addr];
}Peoinfo;
typedef struct Contact
{
	Peoinfo date[Max];
	int sz;
}Contact;
enum
{
	Exit,//0
	Add,//1
	Del,//2
	Search,//3
	Mod,//4
	Show,//5
	Sore//6
	//结果分别是
};

一个人的信息有名字,年龄,性别,电话,地址
第二个是保存了多少人的信息
枚举了一些可能
首先我们把通讯录初始化

void contactInit(Contact* pc)
{
	pc->sz = 0;
	memset(pc->date, 0, sizeof(Peoinfo) * Max);
}

在这里插入图片描述
这样我们就成功初始化了通讯录
那么我们来实现第一个函数增加人的信息

void Addcontact(Contact* pc)
{
	if (pc->sz == Max)
	{
		printf("通讯录已满\n");
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", pc->date[pc->sz].name);
		printf("请输入年龄:");
		scanf("%d", &(pc->date[pc->sz].age));
		printf("请输入性别:");
		scanf("%s", pc->date[pc->sz].sex);
		printf("请输入电话:");
		scanf("%s", pc->date[pc->sz].tele);
		printf("请输入地址:");
		scanf("%s", pc->date[pc->sz].addr);

		pc->sz++;
		printf("增加联系人成功\n");
	}
}

在这里插入图片描述
写到这里我们可以实现这些功能

接下来我们来打印这些数据

void Showcontact(Contact* pc)
{
	printf("%-20s\t%-5s\t%-8s\t%-12s\t%-20s\n","姓名","年龄","性别","电话","地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-8s\t%-12s\t%-20s\n", pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].tele,
			pc->date[i].addr);
	}
}

在这里插入图片描述
接下来我们实现删除人的信息

int Findname(Contact* pc, char name[20])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name,name)==0)
		{
			return i;
		}
	}
	return -1;
}

void Delcontact(Contact* pc)
{
	char name[20];
	printf("请输入要删除人的信息:");
	scanf("%s", name);
	int ret = Findname(pc,name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
	}
	else
	{
		int j = 0;
		for (j = ret; j < pc->sz - 1; j++)
		{
			pc->date[j] = pc->date[j + 1];
		}
		printf("成功删除联系人\n");
	}
}

在这里插入图片描述
定义一个函数判断是否相等,相等返回下标
那么我们来搜所人是否存在

void Searchcontact(Contact* pc)
{
	char name[20];
	printf("输入要搜索人的信息:");
	scanf("%s", name);
	int ret = Findname(pc, name);
	if (ret == -1)
	{
		printf("要搜索的人不存在\n");
	}
	else
	{
		printf("%-20s\t%-5s\t%-8s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-5d\t%-8s\t%-12s\t%-20s\n", pc->date[ret].name,
			pc->date[ret].age,
			pc->date[ret].sex,
			pc->date[ret].tele,
			pc->date[ret].addr);
	}
}

在这里插入图片描述
那么怎么修改信息

void Modcontact(Contact* pc)
{
	char name[20];
	printf("请输入要修改人的姓名");
	scanf("%s", name);
	int ret = Findname(pc,name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", pc->date[ret].name);
		printf("请输入年龄:");
		scanf("%d", &(pc->date[ret].age));
		printf("请输入性别:");
		scanf("%s", pc->date[ret].sex);
		printf("请输入电话:");
		scanf("%s", pc->date[ret].tele);
		printf("请输入地址:");
		scanf("%s", pc->date[ret].addr);
		printf("成功修改\n");
	}
}

在这里插入图片描述
最后一个我们可以来排序,按照名字来排序

int com_name(const void* e1, const void* e2)
{
	return strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name);
}

void Sorecontact(Contact* pc)
{
	qsort(pc->date,pc->sz,sizeof(Peoinfo),com_name);
}

在这里插入图片描述
到这里我们的静态版本通讯录就完成了

动态版本

思想:静态版本是固定的容量,我们只用几个数据就浪费了很多空间
动态版本首先我们开辟一个3个空间的信息,不够了我们每次增加2个空间
那么首先增容就需要定义一个信息的地址,一直用那个地方增加容量

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 100
#define Max_name 20
#define Max_sex 8
#define Max_tele 12
#define Max_addr 20
#define INC_SZ 3//初识的容量
#define ADD_SZ 2//每次增加的容量

typedef struct Peoinfo
{
	char name[Max_name];
	int age;
	char sex[Max_sex];
	char tele[Max_tele];
	char addr[Max_addr];
}Peoinfo;

typedef struct Contact
{
	Peoinfo* date;
	int sz;
	int capaticy;
}Contact;

date是一个指针,每一个存放的都是Peoinfo的信息
初始化

void contactInit(Contact* pc)
{
	pc->date= (Peoinfo*)malloc(sizeof(Peoinfo)* 3);
	if (pc->date == NULL)
		return;
	pc->sz = 0;
	pc->capaticy = INC_SZ;
}

其他的程序不改变,只需要改变增加人时要考虑的增容和退出时释放空间
我们首先看增容

int Findcapa(Contact* pc)
{
	if (pc->capaticy == pc->sz)
	{
		Peoinfo* pf = (Peoinfo*)realloc(pc->date, (pc->capaticy + ADD_SZ)*sizeof(Peoinfo));
		if (pf == NULL)
		{
			perror("Findcapa");
			return -1;
		}
		else
		{
			pc->date = pf;
			pc->capaticy += ADD_SZ;
			printf("增容成功\n");
			return 1;
		}
	}
	return 1;
}
void Addcontact(Contact* pc)
{
	int ret=Findcapa(pc);
	if (ret == -1)
	{
		printf("增容失败\n");
		return;
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", pc->date[pc->sz].name);
		printf("请输入年龄:");
		scanf("%d", &(pc->date[pc->sz].age));
		printf("请输入性别:");
		scanf("%s", pc->date[pc->sz].sex);
		printf("请输入电话:");
		scanf("%s", pc->date[pc->sz].tele);
		printf("请输入地址:");
		scanf("%s", pc->date[pc->sz].addr);
		pc->sz++;
		printf("增加联系人成功\n");
	}
}

定义一个函数来增容
在这里插入图片描述
那么我们在退出的时候需要释放掉空间

void exitcontact(Contact* pc)
{
	free(pc->date);
	pc->date = NULL;
	pc->capaticy = 0;
	pc->sz = 0;
}

文件版本

思想:退出通讯录的时候需要把数据保存到文件中,再次打开,需要把文件中的数据放在我们的程序中。
需要改变的是退出通讯录时把信息保存到文件中,打开文件时,把文件的信息放到我们的程序中

那么我们来实现退出通讯录时保存信息到文件中

void Savecontact(Contact* pc)
{
	FILE* pfw=fopen("data.txt", "wb");
	if (pfw == NULL)
	{
		perror("Savecontact::fopen");
		return;
	}
	for (int i = 0; i < pc->sz; i++)
	{
		fwrite(pc->date + i, sizeof(Peoinfo), 1, pfw);
	}
	fclose(pfw);
	pfw = NULL;
}

在这里插入图片描述
我们在创建文件下找到我们的文件
在这里插入图片描述
在这里插入图片描述
打开后是用二进制储存的
接下来就需要我们在打开文件时把文件的信息放到程序中
我们在初始化时就需我们把文件中的信息放到程序中我们来实现

void openfile(Contact* pc)
{
	FILE* pfr = fopen("data.txt", "rb");
	if (pfr == NULL)
	{
		perror("openfile::fopen");
		return;
	}
	Peoinfo tmp = { 0 };
	while (fread(&tmp, sizeof(Peoinfo), 1, pfr))
	{
		Findcapa(pc);
		pc->date[pc->sz] = tmp;
		pc->sz++;
	}
	fclose(pfr);
	pfr = NULL;
}
void contactInit(Contact* pc)
{
	pc->date = (Peoinfo*)malloc(sizeof(Peoinfo)* 3);
	if (pc->date == NULL)
		return;
	pc->sz = 0;
	pc->capaticy = INC_SZ;
	openfile(pc);
}

在这里插入图片描述

在这里插入图片描述
我们直接就能把文件中的数据打印出来

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 100
#define Max_name 20
#define Max_sex 8
#define Max_tele 12
#define Max_addr 20
#define INC_SZ 3//初识的容量
#define ADD_SZ 2//每次增加的容量

typedef struct Peoinfo
{
	char name[Max_name];
	int age;
	char sex[Max_sex];
	char tele[Max_tele];
	char addr[Max_addr];
}Peoinfo;

typedef struct Contact
{
	Peoinfo* date;
	int sz;
	int capaticy;
}Contact;
//typedef struct Contact
//{
//	Peoinfo date[Max];
//	int sz;
//}Contact;


enum
{
	Exit,
	Add,
	Del,
	Search,
	Mod,
	Show,
	Sore
};

//初始化通讯录
void contactInit(Contact* pc);

//增加人的信息
void Addcontact(Contact* pc);

//展示信息
void Showcontact(Contact* pc);

//删除人的信息
void Delcontact(Contact* pc);

//搜索人的信息是否存在
void Searchcontact(Contact* pc);

//修改人的信息
void Modcontact(Contact* pc);

//名字排序
void Sorecontact(Contact* pc);

//退出通讯录
void exitcontact(Contact* pc);

//保存信息
void Savecontact(Contact* pc);

contact.c

#include"contact.h"

//void contactInit(Contact* pc)
//{
//	pc->sz = 0;
//	memset(pc->date, 0, sizeof(Peoinfo) * Max);
//}

//void contactInit(Contact* pc)
//{
//	pc->date= (Peoinfo*)malloc(sizeof(Peoinfo)* 3);
//	if (pc->date == NULL)
//		return;
//	pc->sz = 0;
//	pc->capaticy = INC_SZ;
//}
int Findcapa(Contact* pc);
void openfile(Contact* pc)
{
	FILE* pfr = fopen("data.txt", "rb");
	if (pfr == NULL)
	{
		perror("openfile::fopen");
		return;
	}
	Peoinfo tmp = { 0 };
	while (fread(&tmp, sizeof(Peoinfo), 1, pfr))
	{
		Findcapa(pc);
		pc->date[pc->sz] = tmp;
		pc->sz++;
	}
	fclose(pfr);
	pfr = NULL;
}
void contactInit(Contact* pc)
{
	pc->date = (Peoinfo*)malloc(sizeof(Peoinfo)* 3);
	if (pc->date == NULL)
		return;
	pc->sz = 0;
	pc->capaticy = INC_SZ;
	openfile(pc);
}
int Findcapa(Contact* pc)
{
	if (pc->capaticy == pc->sz)
	{
		Peoinfo* pf = (Peoinfo*)realloc(pc->date, (pc->capaticy + ADD_SZ)*sizeof(Peoinfo));
		if (pf == NULL)
		{
			perror("Findcapa");
			return -1;
		}
		else
		{
			pc->date = pf;
			pc->capaticy += ADD_SZ;
			printf("增容成功\n");
			return 1;
		}
	}
	return 1;
}
void Addcontact(Contact* pc)
{
	int ret=Findcapa(pc);
	if (ret == -1)
	{
		printf("增容失败\n");
		return;
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", pc->date[pc->sz].name);
		printf("请输入年龄:");
		scanf("%d", &(pc->date[pc->sz].age));
		printf("请输入性别:");
		scanf("%s", pc->date[pc->sz].sex);
		printf("请输入电话:");
		scanf("%s", pc->date[pc->sz].tele);
		printf("请输入地址:");
		scanf("%s", pc->date[pc->sz].addr);
		pc->sz++;
		printf("增加联系人成功\n");
	}
}

//void Addcontact(Contact* pc)
//{
//	if (pc->sz == Max)
//	{
//		printf("通讯录已满\n");
//	}
//	else
//	{
//		printf("请输入姓名:");
//		scanf("%s", pc->date[pc->sz].name);
//		printf("请输入年龄:");
//		scanf("%d", &(pc->date[pc->sz].age));
//		printf("请输入性别:");
//		scanf("%s", pc->date[pc->sz].sex);
//		printf("请输入电话:");
//		scanf("%s", pc->date[pc->sz].tele);
//		printf("请输入地址:");
//		scanf("%s", pc->date[pc->sz].addr);
//
//		pc->sz++;
//		printf("增加联系人成功\n");
//	}
//}

void Showcontact(Contact* pc)
{
	printf("%-20s\t%-5s\t%-8s\t%-12s\t%-20s\n","姓名","年龄","性别","电话","地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-8s\t%-12s\t%-20s\n", pc->date[i].name,
			pc->date[i].age,
			pc->date[i].sex,
			pc->date[i].tele,
			pc->date[i].addr);
	}
}

int Findname(Contact* pc, char name[20])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name,name)==0)
		{
			return i;
		}
	}
	return -1;
}

void Delcontact(Contact* pc)
{
	char name[20];
	printf("请输入要删除人的信息:");
	scanf("%s", name);
	int ret = Findname(pc,name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
	}
	else
	{
		int j = 0;
		for (j = ret; j < pc->sz - 1; j++)
		{
			pc->date[j] = pc->date[j + 1];
		}
		printf("成功删除联系人\n");
	}
}

void Searchcontact(Contact* pc)
{
	char name[20];
	printf("输入要搜索人的信息:");
	scanf("%s", name);
	int ret = Findname(pc, name);
	if (ret == -1)
	{
		printf("要搜索的人不存在\n");
	}
	else
	{
		printf("%-20s\t%-5s\t%-8s\t%-12s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-5d\t%-8s\t%-12s\t%-20s\n", pc->date[ret].name,
			pc->date[ret].age,
			pc->date[ret].sex,
			pc->date[ret].tele,
			pc->date[ret].addr);
	}
}

void Modcontact(Contact* pc)
{
	char name[20];
	printf("请输入要修改人的姓名");
	scanf("%s", name);
	int ret = Findname(pc,name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		printf("请输入姓名:");
		scanf("%s", pc->date[ret].name);
		printf("请输入年龄:");
		scanf("%d", &(pc->date[ret].age));
		printf("请输入性别:");
		scanf("%s", pc->date[ret].sex);
		printf("请输入电话:");
		scanf("%s", pc->date[ret].tele);
		printf("请输入地址:");
		scanf("%s", pc->date[ret].addr);
		printf("成功修改\n");
	}
}

int com_name(const void* e1, const void* e2)
{
	return strcmp(((Peoinfo*)e1)->name, ((Peoinfo*)e2)->name);
}

void Sorecontact(Contact* pc)
{
	qsort(pc->date,pc->sz,sizeof(Peoinfo),com_name);
}

void exitcontact(Contact* pc)
{
	free(pc->date);
	pc->date = NULL;
	pc->capaticy = 0;
	pc->sz = 0;
}

void Savecontact(Contact* pc)
{
	FILE* pfw=fopen("data.txt", "wb");
	if (pfw == NULL)
	{
		perror("Savecontact::fopen");
		return;
	}
	for (int i = 0; i < pc->sz; i++)
	{
		fwrite(pc->date + i, sizeof(Peoinfo), 1, pfw);
	}
	fclose(pfw);
	pfw = NULL;
}

main.c

#include"contact.h"

void menu()
{
	printf("************************\n");
	printf("***  1.Add  2.Del    ***\n");
	printf("***  3.Search        ***\n");
	printf("***  4.Mod  5.Show   ***\n");
	printf("***  6.Sore 0.Exit   ***\n");
	printf("************************\n");
}
int main()
{
	int input = 0;
	Contact c;
	contactInit(&c);
	do
	{
		menu();
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case Exit:
			Savecontact(&c);
			printf("保存成功\n");
			exitcontact(&c);
			printf("退出通讯录\n");
			break;
		case Add:
			Addcontact(&c);
			break;
		case Del:
			Delcontact(&c);
			break; 
		case Search:
			Searchcontact(&c);
			break;
		case Mod:
			Modcontact(&c);
			break;
		case Show:
			Showcontact(&c);
			break;
		case Sore:
			Sorecontact(&c);
			break;
		default :
			printf("选择错误\n");
		}
	} while (input);
	return 0;
}


这就是全部的代码我们来展示一遍
在这里插入图片描述
(要退出时才会保存切记),我刚才就忘记退出了

谢谢你的观看!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的xlwt和xlrd模块来读、写Excel文件,同时使用tkinter模块来设计通讯录系统的GUI界面。下面是一个示例代码,用于设计通讯录系统并实现增删改查功能,并将数据录入Excel文档中: ``` import tkinter as tk import xlwt import xlrd class AddressBook: def __init__(self, master): self.master = master master.title("通讯录系统") # 创建GUI界面 self.label_name = tk.Label(master, text="姓名:") self.label_name.grid(row=0, column=0) self.entry_name = tk.Entry(master) self.entry_name.grid(row=0, column=1) self.label_phone = tk.Label(master, text="电话:") self.label_phone.grid(row=1, column=0) self.entry_phone = tk.Entry(master) self.entry_phone.grid(row=1, column=1) self.label_email = tk.Label(master, text="邮箱:") self.label_email.grid(row=2, column=0) self.entry_email = tk.Entry(master) self.entry_email.grid(row=2, column=1) # 添加按钮 self.button_add = tk.Button(master, text="添加", command=self.add_contact) self.button_add.grid(row=3, column=0) # 删除按钮 self.button_delete = tk.Button(master, text="删除", command=self.delete_contact) self.button_delete.grid(row=3, column=1) # 修改按钮 self.button_edit = tk.Button(master, text="修改", command=self.edit_contact) self.button_edit.grid(row=3, column=2) # 查询按钮 self.button_search = tk.Button(master, text="查询", command=self.search_contact) self.button_search.grid(row=3, column=3) # 创建Excel文件和Sheet self.workbook = xlwt.Workbook() self.worksheet = self.workbook.add_sheet("通讯录") self.row = 0 self.col = 0 # 写入表头 self.worksheet.write(self.row, self.col, "姓名") self.col += 1 self.worksheet.write(self.row, self.col, "电话") self.col += 1 self.worksheet.write(self.row, self.col, "邮箱") self.row += 1 self.col = 0 def add_contact(self): # 获取用户输入的信息 name = self.entry_name.get() phone = self.entry_phone.get() email = self.entry_email.get() # 写入数据到Excel文件中 self.worksheet.write(self.row, self.col, name) self.col += 1 self.worksheet.write(self.row, self.col, phone) self.col += 1 self.worksheet.write(self.row, self.col, email) self.row += 1 self.col = 0 # 清空文本框 self.entry_name.delete(0, tk.END) self.entry_phone.delete(0, tk.END) self.entry_email.delete(0, tk.END) # 保存到文件 self.workbook.save("通讯录.xls") def delete_contact(self): # 获取用户输入的姓名 name = self.entry_name.get() # 遍历Excel文件,查找要删除的行 for i in range(1, self.row): if self.worksheet.cell_value(i, 0) == name: # 删除行 self.worksheet._Worksheet__rows.pop(i) self.row -= 1 # 保存到文件 self.workbook.save("通讯录.xls") break # 清空文本框 self.entry_name.delete(0, tk.END) self.entry_phone.delete(0, tk.END) self.entry_email.delete(0, tk.END) def edit_contact(self): # 获取用户输入的姓名 name = self.entry_name.get() # 遍历Excel文件,查找要编辑的行 for i in range(1, self.row): if self.worksheet.cell_value(i, 0) == name: # 获取用户输入的信息 phone = self.entry_phone.get() email = self.entry_email.get() # 修改数据 self.worksheet.write(i, 1, phone) self.worksheet.write(i, 2, email) # 保存到文件 self.workbook.save("通讯录.xls") break # 清空文本框 self.entry_name.delete(0, tk.END) self.entry_phone.delete(0, tk.END) self.entry_email.delete(0, tk.END) def search_contact(self): # 获取用户输入的姓名 name = self.entry_name.get() # 遍历Excel文件,查找要查询的行 for i in range(1, self.row): if self.worksheet.cell_value(i, 0) == name: # 显示查询结果 self.entry_phone.delete(0, tk.END) self.entry_phone.insert(0, self.worksheet.cell_value(i, 1)) self.entry_email.delete(0, tk.END) self.entry_email.insert(0, self.worksheet.cell_value(i, 2)) break def load_contacts(self): # 加载Excel文件中的数据 workbook = xlrd.open_workbook("通讯录.xls") worksheet = workbook.sheet_by_index(0) self.row = worksheet.nrows # 遍历Excel文件中的数据,并显示到GUI界面中 for i in range(1, self.row): name = worksheet.cell_value(i, 0) phone = worksheet.cell_value(i, 1) email = worksheet.cell_value(i, 2) self.worksheet.write(self.row, self.col, name) self.col += 1 self.worksheet.write(self.row, self.col, phone) self.col += 1 self.worksheet.write(self.row, self.col, email) self.row += 1 self.col = 0 root = tk.Tk() address_book = AddressBook(root) address_book.load_contacts() root.mainloop() ``` 在上面的示例代码中,我们使用tkinter模块创建了一个GUI界面,包含文本框和四个按钮,分别对应添加、删除、修改和查询操作。当用户点击这些按钮时,我们会从Excel文件中读取、修改、删除或查询数据,并将结果显示到GUI界面中。 同时,我们也在GUI界面中显示了已经录入的数据,并在程序启动时从Excel文件中读取数据。最后,我们将Excel文件保存到了本地磁盘上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值