C语言小项目通信录实现


通信录一般都会可以:1.添加好友信息。2.删除指定名字的好友信息。3.查找指定名字的好友信息。4.修改好友信息。5.(展示)打印好友信息。6.排序。7.保存好友信息.
所以我们可以按照这些写一些函数实现这些功能

不可保存版通信录(容量规定好)

test.c文件

//测试
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
	printf("**************************************\n");
	printf("******** 1.add      2.del     ********\n");
	printf("******** 3.search   4.modify  ********\n");
	printf("******** 5.show     6.sort    ********\n");
	printf("********       0.exit         ********\n");
	printf("**************************************\n");
}
int main()
{
	int input;
	//创建通讯录
	struct Contact con[MAX] = {0};//con通讯录包含每个人的信息和size
	InitContact(con);//初始化通讯录
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
		{
					AddContacts(con);
					break;
		}
			
		case DEL:
		{
					DelContacts(con);
					break;
		}
			
		case SEARCH:
		{
					   SearchContacts(con);
					   break;
		}
			
		case MODIFY:
		{
					   ModifyContacts(con);
					   break;
		}
			
		case SHOW:
		{
					 ShowContacts(con);
					 break;
		}
			
		case SORT:
		{
					 SortContacts(con);
					 break;
		}
			
		case EXIT:
		{
					 printf("退出\n");
					 break;
		}
			
		default:
		{
				   printf("选择错误\n");
				   break;
		}
		}
	} while (input);
	return 0;
}

contact.h文件

//通常我们会在头文件中定义结构体类型,枚举类型,联合类型,宏定义、函数声明、include包含等内容
#include <stdio.h>
#include <string.h>
#define MAX 500 //通讯录的容量
#define MAX_NAME 10 //名字最大允许长度
#define MAX_SEX 5   //性别
#define MAX_TELE 12  //电话
#define MAX_ADDR 30  //地址
enum Option_1
{
	//枚举常量
	EXIT, //0
	ADD,  //1
	DEL,  //2
	SEARCH,  //3
	MODIFY,  //4
	SHOW,  //5
	SORT  //6
};
enum Option_2
{
	exit,
	NAME,
	AGE,
	SEX,
	TELE,
	ADDR
};
struct PeoInfo //定义个人信息类型
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};
struct Contact //通信录类型
{
	struct PeoInfo data[MAX];//存放500个人的信息
	int size;//size用来记录当前通信录有多少个人的信息
};
//初始化通信录
void InitContact(struct Contact* ps);
//添加一个好友到通信录
void AddContacts(struct Contact* ps);
//从通信录中删除一个好友
void DelContacts(struct Contact* ps);
//查找某个好友的信息
void SearchContacts(struct Contact* ps);
//修改某个好友的信息
void ModifyContacts(struct Contact* ps);
//打印某个好友的信息
void ShowContacts(struct Contact* ps);
//将通信录好友进行排序
void SortContacts(struct Contact* ps);



contact1.c文件

//我们通常在源文件中编写实际的功能实现。
/*实现函数的功能:1.添加好友信息。2.删除指定名字的好友信息。3.查找指定名字的好友信息。
4.修改好友信息。5.打印好友信息。6.排序。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(struct Contact* ps)
{
	memset(ps->data, 0, sizeof(ps->data));
	ps->size = 0;//设置通讯录里最初只有0个人的信息
}
int FindByName(struct Contact* ps, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(name,ps->data[i].name) == 0)
		{
			return i;//返回name所在元素的下标
		}
	}
	return -1;//找不到
}
void menu2()
{
	printf("********************************\n");
	printf("****** 1.name     2.age  *******\n");
	printf("****** 3.sex      4.tele *******\n");
	printf("****** 5.addr     0.exit *******\n");
	printf("********************************\n");
}
void AddContacts(struct Contact* ps)
{
	if (ps->size == MAX)
	{
		printf("抱歉,你朋友太多了,通讯录已满,无法添加\n");
	}
	else
	{
		printf("请输入好友的信息:\n");
		printf("名字:");
		scanf("%s", ps->data[ps->size].name);
		printf("年龄:");
		scanf("%d", &(ps->data[ps->size].age));
		printf("性别:");
		scanf("%s", ps->data[ps->size].sex);
		printf("电话:");
		scanf("%s", ps->data[ps->size].tele);
		printf("地址:");
		scanf("%s", ps->data[ps->size].addr);
		ps->size++;//每添加一个好友的信息size就+1
		printf("添加成功\n");
	}
}
void DelContacts(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你想要删除的好友的名字:");
	scanf("%s", name);
	//查找要删除的人在什么位置,找到了就返回名字所在元素的下标,找不到就返回-1
	int ret=FindByName(ps, name);
	if (ret == -1)
	{
		printf("你想要删除的好友不存在\n");
	}
	else
	{
		int j = 0;
		for (j = ret; j< ps->size - 1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功\n");
	}
}
void SearchContacts(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你想要查找的好友的名字:");
	scanf("%s", name);
	int ret = FindByName(ps, name);
	if (ret == -1)
	{
		printf("你想要查找的好友不存在\n");
	}
	else
	{
		printf("%-10s  %-4s  %-5s  %-12s  %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-10s  %-4d  %-5s  %-12s  %-20s\n",ps->data[ret].name,
			ps->data[ret].age,ps->data[ret].sex,
			ps->data[ret].tele,ps->data[ret].addr);
	}
}
void ModifyContacts(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入想要修改的好友的名字:");
	scanf("%s", name);
	int ret = FindByName(ps, name);
	if (ret == -1)
	{
		printf("想要修改的好友的信息不存在\n");
	}
	else
	{
		int a;
		menu2();
		do
		{
			printf("请输入你想修改什么信息:");
			scanf("%d", &a);
			switch (a)
			{
			case NAME:
			{
						 char name[MAX_NAME];
						 printf("请输入新名字:");
						 scanf("%s", name);
						 strcpy(ps->data[ret].name,name);
						 break;
			}
			case AGE:
			{
						int age;
						printf("请输入新年龄:");
						scanf("%d", &age);
						ps->data[ret].age = age;
						break;
			}
			case SEX:
			{
						char sex[MAX_SEX];
						printf("请输入新性别:");
						scanf("%s", sex);
						strcpy(ps->data[ret].sex,sex);
						break;
			}

			case TELE:
			{
						 char tele[MAX_TELE];
						 printf("请输入新电话:");
						 scanf("%s", tele);
						 strcpy(ps->data[ret].tele,tele);
						 break;
			}
			case ADDR:
			{
						 char addr[MAX_ADDR];
						 printf("请输入新地址:");
						 scanf("%s", addr);
						 strcpy(ps->data[ret].addr, addr);
						 break;
			}
			case exit:
				break;
			}
		} while (a);
	}
}
void ShowContacts(struct Contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		int i = 0;
		printf("%-10s %-4s %-5s %-12s %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (i = 0; i < ps->size; i++)
		{
			printf("%-10s %-4d %-5s %-12s %-20s\n", ps->data[i].name,
				ps->data[i].age, ps->data[i].sex,
				ps->data[i].tele, ps->data[i].addr);
		}
	}
}
void SortContacts(struct Contact* ps)
{
	int b;
	int i, j,k;
	do
	{
		menu2();
		printf("请输入你想要按什么进行排序:");
		scanf("%d", &b);
		switch (b)
		{
		case NAME:
		{
					 //冒泡排序
					 for (i = 0; i < ps->size - 1; i++)
					 {
						 for (j =0; j < ps->size - 1-i; j++)
						 {
							 if (strcmp(ps->data[j].name, ps->data[j + 1].name)>0)
							 {
								 struct PeoInfo tmp = ps->data[j + 1];
								 ps->data[j + 1] = ps->data[j];
								 ps->data[j] = tmp;
							 }
						 }
					 }
					 break;
		}
		case AGE:
		{
					for (i = 0; i < ps->size - 1; i++)
					{
						for (j =0; j < ps->size - 1-i; j++)
						{
							if (ps->data[j].age>ps->data[j+1].age)
							{
								struct PeoInfo tmp = ps->data[j + 1];
								ps->data[j+ 1] = ps->data[j];
								ps->data[j] = tmp;
							}
						}
					}
					break;
		}
		case SEX:
		{
					for (i = 0; i < ps->size - 1; i++)
					{
						for (j = 0; j < ps->size - 1-i; j++)
						{
							if (strcmp(ps->data[j].sex, ps->data[j + 1].sex)>0)
							{
								struct PeoInfo tmp = ps->data[j + 1];
								ps->data[j + 1] = ps->data[j];
								ps->data[j] = tmp;
							}
						}
					}
					break;
		}

		case TELE:
		{
					 for (i = 0; i < ps->size - 1; i++)
					 {
						 for (j = 0; j < ps->size - 1-i; j++)
						 {
							 if (strcmp(ps->data[j].tele, ps->data[j + 1].tele)>0)
							 {
								 struct PeoInfo tmp = ps->data[j + 1];
								 ps->data[j + 1] = ps->data[j];
								 ps->data[j] = tmp;
							 }
						 }
					 }
					 break;
		}
		case ADDR:
		{
					 for (i = 0; i < ps->size - 1; i++)
					 {
						 for (j =0; j < ps->size - 1-i; j++)
						 {
							 if (strcmp(ps->data[j].addr, ps->data[j + 1].addr)>0)
							 {
								 struct PeoInfo tmp = ps->data[j+ 1];
								 ps->data[j+ 1] = ps->data[j];
								 ps->data[j] = tmp;
							 }
						 }
					 }
					 break;
		}
		case exit:
			break;
		}
		printf("%-10s %-4s %-5s %-12s %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (k = 0; k < ps->size; k++)
		{
			printf("%-10s %-4d %-5s %-12s %-20s\n", ps->data[k].name,
				ps->data[k].age, ps->data[k].sex,
				ps->data[k].tele, ps->data[k].addr);
		}
	} while (b);
}

动态版(通信录容量可根据实际需要变化,可大可小)通信录,也可保存

动态版(通信录容量可根据实际需要变化,可大可小)通信录,也可保存:
test.c文件

//测试
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
	printf("**************************************\n");
	printf("******** 1.add      2.del     ********\n");
	printf("******** 3.search   4.modify  ********\n");
	printf("******** 5.show     6.sort    ********\n");
	printf("******** 7.save     0.exit    ********\n");
	printf("**************************************\n");
}
int main()
{
	int input;
	//创建通讯录
	struct Contact con = { 0 };
	InitContact(&con);//初始化通讯录
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
		{
					AddContacts(&con);
					break;
		}
			
		case DEL:
		{
					DelContacts(&con);
					break;
		}
			
		case SEARCH:
		{
					   SearchContacts(&con);
					   break;
		}
			
		case MODIFY:
		{
					   ModifyContacts(&con);
					   break;
		}
			
		case SHOW:
		{
					 ShowContacts(&con);
					 break;
		}
			
		case SORT:
		{
					 SortContacts(&con);
					 break;
		}
			
		case EXIT:
		{
					 //释放动态开辟的内存--销毁通信录
					 DestroyContact(&con);
					 printf("退出\n");
					 break;
		}
		case SAVE:
		{
					 SaveContact(&con);
					 break;
		}
		default:
		{
				   printf("选择错误\n");
				   break;
		}
		}
	} while (input);
	return 0;
}

contact.h文件

//声明函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 10 //名字最大允许长度
#define MAX_SEX 5   //性别
#define MAX_TELE 12  //电话
#define MAX_ADDR 30  //地址
enum Option_1
{
	//枚举常量
	EXIT, //0
	ADD,  //1
	DEL,  //2
	SEARCH,  //3
	MODIFY,  //4
	SHOW,  //5
	SORT,  //6
	SAVE
};
enum Option_2
{
	Exit,
	NAME,
	AGE,
	SEX,
	TELE,
	ADDR
};
struct PeoInfo //定义个人信息类型
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};
struct Contact //通信录类型
{
	struct PeoInfo* data;//结构体指针指向的内存空间用来存放每个人的信息
	int size;//size用来记录当前通信录有多少个人的信息
	int capacity;//通信录的容量(一共能存放多少个人的信息)

};
//初始化通信录
void InitContact(struct Contact* ps);
//添加一个好友到通信录
void AddContacts(struct Contact* ps);
//从通信录中删除一个好友
void DelContacts(struct Contact* ps);
//查找某个好友的信息
void SearchContacts(struct Contact* ps);
//修改某个好友的信息
void ModifyContacts(struct Contact* ps);
//打印某个好友的信息
void ShowContacts(struct Contact* ps);
//将通信录好友进行排序
void SortContacts(struct Contact* ps);
//释放动态开辟的内存--销毁通信录
void DestroyContact(struct Contact* ps);
//保存通信录
void SaveContact(struct Contact* ps);

contact.c文件

/*实现函数的功能:1.添加好友信息。2.删除指定名字的好友信息。3.查找指定名字的好友信息。
4.修改好友信息。5.打印好友信息。6.排序。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(struct Contact* ps)//初始化通信录
{
	void LoadContact(struct Contact* ps);
	ps->data = (struct PeoInfo*)malloc(sizeof(struct PeoInfo));//动态开辟sizeof(struct PeoInfo)字节的内存空间(只能存放一个人的信息)
	if (ps->data == NULL)//动态开辟内存失败
	{
		return;
	}
	ps->size = 0;//设置通讯录里最初只有0个人的信息
	ps->capacity = 1;//最初通信录的容量为1
	LoadContact(ps);
}
void LoadContact(struct Contact* ps)
{
	struct PeoInfo tmp = { 0 };
	FILE* pfRead = fopen("contact.s", "rb");
	if (pfRead == NULL)
	{
		printf("LoadContact:>%s\n", strerror(errno));
		return;
	}
	//读取文件,将其加载到通信录中
	while (fread(&tmp, sizeof(PeoInfo), 1, pfRead))
	{
		if (ps->capacity == ps->size)
		{
			struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 1)*sizeof(struct PeoInfo));//增加通信录的容量(+1)
			if (ptr != NULL)
			{
				ps->data = ptr;
				ps->capacity += 1;
			}
			else
			{
				printf("增容失败\n");
			}
		}
		ps->data[ps->size] = tmp;
		ps->size++;
	}
	fclose(pfRead);
	pfRead = NULL;
}
void DestroyContact(struct Contact* ps)
{
	free(ps->data);
	ps->data = NULL;
}
int FindByName(struct Contact* ps, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(name,ps->data[i].name) == 0)
		{
			return i;//返回name所在元素的下标
		}
	}
	return -1;//找不到
}
void menu2()
{
	printf("********************************\n");
	printf("****** 1.name     2.age  *******\n");
	printf("****** 3.sex      4.tele *******\n");
	printf("****** 5.addr     0.exit *******\n");
	printf("********************************\n");
}
void AddContacts(struct Contact* ps)
{
	if (ps->capacity == ps->size)
	{
		struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 1)*sizeof(struct PeoInfo));//增加通信录的容量(+1)
		if (ptr != NULL)
		{
			ps->data = ptr;
			ps->capacity += 1;
		}
		else
		{
			printf("增容失败\n");
		}
	}
	printf("请输入好友的信息:>\n");
	printf("名字:>");
	scanf("%s", ps->data[ps->size].name);
	printf("年龄:>");
	scanf("%d", &(ps->data[ps->size].age));
	printf("性别:>");
	scanf("%s", ps->data[ps->size].sex);
	printf("电话:>");
	scanf("%s", ps->data[ps->size].tele);
	printf("地址:>");
	scanf("%s", ps->data[ps->size].addr);
	ps->size++;//每添加一个好友的信息size就+1
	printf("添加成功\n");
}
void DelContacts(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你想要删除的好友的名字:>");
	scanf("%s", name);
	//查找要删除的人在什么位置,找到了就返回名字所在元素的下标,找不到就返回-1
	int ret=FindByName(ps, name);
	if (ret == -1)
	{
		printf("你想要删除的好友不存在\n");
	}
	else
	{
		int j = 0;
		for (j = ret; j< ps->size - 1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功\n");
	}
	struct PeoInfo* pt = (struct PeoInfo*)realloc(ps->data, (ps->capacity-1)*sizeof(struct PeoInfo));//减小通信录的容量(-1)
	if (pt != NULL)
	{
		ps->data = pt;
		ps->capacity -= 1;
	}
	else
	{
		printf("减容失败\n");
	}
}
void SearchContacts(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你想要查找的好友的名字:>");
	scanf("%s", name);
	int ret = FindByName(ps, name);
	if (ret == -1)
	{
		printf("你想要查找的好友不存在\n");
	}
	else
	{
		printf("%-10s  %-4s  %-5s  %-12s  %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-10s  %-4d  %-5s  %-12s  %-20s\n",ps->data[ret].name,
			ps->data[ret].age,ps->data[ret].sex,
			ps->data[ret].tele,ps->data[ret].addr);
	}
}
void ModifyContacts(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入想要修改的好友的名字:>");
	scanf("%s", name);
	int ret = FindByName(ps, name);
	if (ret == -1)
	{
		printf("想要修改的好友的信息不存在\n");
	}
	else
	{
		int a;
		menu2();
		do
		{
			printf("请输入你想修改什么信息:>");
			scanf("%d", &a);
			switch (a)
			{
			case NAME:
			{
						 char name[MAX_NAME];
						 printf("请输入新名字:>");
						 scanf("%s", name);
						 strcpy(ps->data[ret].name,name);
						 break;
			}
			case AGE:
			{
						int age;
						printf("请输入新年龄:>");
						scanf("%d", &age);
						ps->data[ret].age = age;
						break;
			}
			case SEX:
			{
						char sex[MAX_SEX];
						printf("请输入新性别:>");
						scanf("%s", sex);
						strcpy(ps->data[ret].sex,sex);
						break;
			}

			case TELE:
			{
						 char tele[MAX_TELE];
						 printf("请输入新电话:>");
						 scanf("%s", tele);
						 strcpy(ps->data[ret].tele,tele);
						 break;
			}
			case ADDR:
			{
						 char addr[MAX_ADDR];
						 printf("请输入新地址:>");
						 scanf("%s", addr);
						 strcpy(ps->data[ret].addr, addr);
						 break;
			}
			case Exit:
				break;
			}
		} while (a);
	}
}
void ShowContacts(struct Contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		int i = 0;
		printf("%-10s %-4s %-5s %-12s %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (i = 0; i < ps->size; i++)
		{
			printf("%-10s %-4d %-5s %-12s %-20s\n", ps->data[i].name,
				ps->data[i].age, ps->data[i].sex,
				ps->data[i].tele, ps->data[i].addr);
		}
	}
}
void SortContacts(struct Contact* ps)
{
	int b;
	int i, j,k;
	do
	{
		menu2();
		printf("请输入你想要按什么进行排序:>");
		scanf("%d", &b);
		switch (b)
		{
		case NAME:
		{
					 //冒泡排序
					 for (i = 0; i < ps->size - 1; i++)
					 {
						 for (j =0; j < ps->size - 1-i; j++)
						 {
							 if (strcmp(ps->data[j].name, ps->data[j + 1].name)>0)
							 {
								 struct PeoInfo tmp = ps->data[j + 1];
								 ps->data[j + 1] = ps->data[j];
								 ps->data[j] = tmp;
							 }
						 }
					 }
					 break;
		}
		case AGE:
		{
					for (i = 0; i < ps->size - 1; i++)
					{
						for (j =0; j < ps->size - 1-i; j++)
						{
							if (ps->data[j].age>ps->data[j+1].age)
							{
								struct PeoInfo tmp = ps->data[j + 1];
								ps->data[j+ 1] = ps->data[j];
								ps->data[j] = tmp;
							}
						}
					}
					break;
		}
		case SEX:
		{
					for (i = 0; i < ps->size - 1; i++)
					{
						for (j = 0; j < ps->size - 1-i; j++)
						{
							if (strcmp(ps->data[j].sex, ps->data[j + 1].sex)>0)
							{
								struct PeoInfo tmp = ps->data[j + 1];
								ps->data[j + 1] = ps->data[j];
								ps->data[j] = tmp;
							}
						}
					}
					break;
		}

		case TELE:
		{
					 for (i = 0; i < ps->size - 1; i++)
					 {
						 for (j = 0; j < ps->size - 1-i; j++)
						 {
							 if (strcmp(ps->data[j].tele, ps->data[j + 1].tele)>0)
							 {
								 struct PeoInfo tmp = ps->data[j + 1];
								 ps->data[j + 1] = ps->data[j];
								 ps->data[j] = tmp;
							 }
						 }
					 }
					 break;
		}
		case ADDR:
		{
					 for (i = 0; i < ps->size - 1; i++)
					 {
						 for (j =0; j < ps->size - 1-i; j++)
						 {
							 if (strcmp(ps->data[j].addr, ps->data[j + 1].addr)>0)
							 {
								 struct PeoInfo tmp = ps->data[j+ 1];
								 ps->data[j+ 1] = ps->data[j];
								 ps->data[j] = tmp;
							 }
						 }
					 }
					 break;
		}
		case Exit:
			break;
		}
		printf("%-10s %-4s %-5s %-12s %-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (k = 0; k < ps->size; k++)
		{
			printf("%-10s %-4d %-5s %-12s %-20s\n", ps->data[k].name,
				ps->data[k].age, ps->data[k].sex,
				ps->data[k].tele, ps->data[k].addr);
		}
	} while (b);
}
void SaveContact(struct Contact* ps)
{
	FILE* pfWrite = fopen("contact.s", "wb");
	if (pfWrite == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	//把通信录中的数据写入到文件中(保存)
	int i;
	for (i = 0; i < ps->size; i++)
	{
		fwrite(&(ps->data[i]), sizeof(struct PeoInfo), 1, pfWrite);
	}
	//关闭文件
	fclose(pfWrite);
	pfWrite = NULL;//将其置为空指针,防止它成为野指针
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值