C语言实现通讯录管理系统

目录

1. 需求分析

2. 程序架构

3. 代码实现(分函数呈现)

(1)主函数代码实现

(2)菜单函数的实现

(3)初始化功能实现

(4)添加联系人功能实现

(5)删除通讯录中的信息

(6)查找通讯录中联系人的信息

(7)查找函数实现

(8)修改联系人的信息

(9)打印通讯录中联系人的信息

(10)对通讯录中联系人的信息进行排序

(11)清空通讯录中联系人的信息

4. 代码呈现(分文件实现)

(1)test.c

(2)contact.h

(3)contact.c


1. 需求分析

通过C语言实现简单的通讯录管理系统,要求实现的功能有:增加联系人信息、删除联系人信息、查找联系人信息、修改联系人信息、清空联系人信息、对联系人的信息进行排序、显示联系人信息

2. 程序架构

程序分为test.c、contact.c两个源文件和contact.h一个头文件。

test.c:主函数接口引入。

contact.c:函数主要实现

contact.h:头文件引入、函数声明、结构体声明。

3. 代码实现(分函数呈现)

(1)主函数代码实现

int main()
{
	//创建通讯录
	struct contact con;//con就是通讯录,里面包含1000个元素的数组和size
	//初始化通讯录
	Init_Contact(&con);
	int input = 0;
	int size = 0;//记录当前有多少人
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			//增加
			Add_Contacter(&con);
			break;
		case DEL:
			//删除
			Del_Contacter(&con);
			break;
		case SEARCH:
			//查找
			Find_Contacter(&con);
			break;
		case MODIFY:
			//修改
			Mod_Contacter(&con);
			break;
		case SHOW:
			//打印
			Print_Contacter(&con);
			break;
		case CLEAR:
			//清空
			Clear_Contacter(&con);
			break;
		case SORT:
			//排序
			Sort_Contacter(&con);
			break;
		case EXIT:
		    //退出
			printf("退出通讯录!\n");
			break;
		default:
			printf("选择错误,请重新输入!\n");
		}
	} while (input);
	return 0;
}

分析:主要是引入函数的接口,此处用了常见的do while循环,并且将input变量作为while()后面括号中的条件,此处是一个极其巧妙的运用,当input变量为0时循环结束,程序终止,此时也与前面的switch和case进行了一一对应。

(2)菜单函数的实现

void menu()
{
	printf("************************************\n");
	printf("****  1.add         2.del       ****\n");
	printf("****  3.search      4.modify    ****\n");
	printf("****  5.show        6.clear     ****\n");
	printf("****  7.sort        0.exit      ****\n");
	printf("************************************\n");
}

分析:简单运用printf将菜单进行输出,通过*来使输出形式更加清晰简洁美观。

(3)初始化功能实现

//初始化通讯录中的信息
void Init_Contact(struct contact* ps)
{
	memset(ps->data, 0, sizeof(ps->data));
	ps->size = 0;//设置通讯录最初只有0个元素
}

分析:通过memset()内存函数初始化通讯录中的信息,同时将size记录联系人数目的变量设置为0。

(4)添加联系人功能实现

//添加通讯录中的信息
void Add_Contacter(struct contact* ps)
{
	if (ps->size == MAX_NUM)
	{
		printf("通讯录已满!无法继续增加!\n");
	}
	else
	{
		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].phone);
		printf("请输入地址:");
		scanf("%s", &ps->data[ps->size].address);

		ps->size++;
		printf("添加成功!\n");
	}
}

分析:在进行添加时要注意进行分情况讨论,首先就是当联系人数目满了的时候就无法继续添加,只有当联系人数目未满的时候才能继续添加,添加后,要将记录联系人数目的变量size进行加一。

(5)删除通讯录中的信息

//删除通讯录中的信息
void Del_Contacter(struct contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你要删除的联系人的姓名:");
	scanf("%s", name);
	//查找要删除的人所在的位置
	//找到了返回名字所在元素的下标,没找到就返回-1
	int pos = Find_byName(ps,name);
	if (pos==-1)//删除的人不存在
	{
		printf("要删除的人不存在!\n");
	}
	else//删除
	{
		int j = 0;
		for (j = pos; j < ps->size-1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功!\n");
	}
}

分析:删除操作并不复杂,就是先查找到我们想要删除的那个联系人,然后将这个联系人后面的信息逐个向前进行覆盖,同时将记录联系人数目的变量size的值进行减1。

(6)查找通讯录中联系人的信息

//查找通讯录中的信息
void Find_Contacter(const struct contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你要查找的联系人的姓名:");
	scanf("%s", name);
	int pos = Find_byName(ps, 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", ps->data[pos].name,
			ps->data[pos].age,
			ps->data[pos].sex,
			ps->data[pos].phone,
			ps->data[pos].address);
	}
}

分析:首先先通过查找函数将我们想要查找到的联系人找到,然后通过printf函数打印联系人的信息。

(7)查找函数实现

static int Find_byName(const struct contact* ps, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (0 == strcmp(ps->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

分析:此处查找函数是通过遍历联系人中的信息进行实现的,当我们想查找的联系人的信息与某个联系人的信息一致时就停止下来,如果能够找到就返回其对应的下标,如果找不到就返回-1。

(8)修改联系人的信息

//修改通讯录中的信息
void Mod_Contacter(struct contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你要修改的联系人的姓名:");
	scanf("%s", name);
	int pos = Find_byName(ps, name);
	if (pos==-1)//修改的人不存在
	{
		printf("要修改的人不存在!\n");
	}
	else
	{
		printf("请输入名字:");
		scanf("%s", &ps->data[pos].name);
		printf("请输入年龄:");
		scanf("%d", &ps->data[pos].age);
		printf("请输入性别:");
		scanf("%s", &ps->data[pos].sex);
		printf("请输入电话:");
		scanf("%s", &ps->data[pos].phone);
		printf("请输入地址:");
		scanf("%s", &ps->data[pos].address);
		printf("修改成功!\n");
	}
}

分析:修改联系人的信息与上面其实类似,首先是找到我们想要修改的联系人的信息,然后再进行修改。

(9)打印通讯录中联系人的信息

//打印通讯录中的信息
void Print_Contacter(const struct contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		//标题
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n",  "姓名", "年龄", "性别", "电话", "地址");
		int i = 0;
		while (i < ps->size)
		{
			//数据
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n", ps->data[i].name, 
				ps->data[i].age, 
				ps->data[i].sex, 
				ps->data[i].phone, 
				ps->data[i].address);
			i++;
		}
	}
}

分析:这个功能并不难实现,就是设置一个循环变量i,然后从头开始对通讯录信息进行遍历,当i小于size的时候将对应联系人的信息打印出来。

(10)对通讯录中联系人的信息进行排序

//对通讯录中的信息进行排序
//排序函数
//1.按照姓名进行排序
int Conpare_ByName(const void *e1,const void *e2)
{
	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
}
//2.按照年龄进行排序
int Conpare_ByAge(const void* e1, const void* e2)
{
	return ((struct PeoInfo*)e1)->age-((struct PeoInfo*)e2)->age;
}
//3.按照住址进行排序
int Conpare_ByAddress(const void* e1, const void* e2)
{
	return strcmp(((struct PeoInfo*)e1)->address, ((struct PeoInfo*)e2)->address);
}
void Sort_Contacter(struct contact* ps)
{
	printf("请选择你想排序的方式:\n");
	printf("1.姓名\n2.年龄\n3.住址\n");
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		qsort(ps->data,ps->size,sizeof(ps->data[0]),Conpare_ByName);
		printf("排序成功\n");
		break;
	case 2:
		qsort(ps->data, ps->size, sizeof(ps->data[0]), Conpare_ByAge);
		printf("排序成功\n");
		break;
	case 3:
		qsort(ps->data, ps->size, sizeof(ps->data[0]), Conpare_ByAddress);
		printf("排序成功\n");
		break;
	}
}

分析:此处运用了qsort快速排序的函数,此处的关键就是设定好自己想要排序的依据,比如我们想根据年龄或者名字进行排序,此处要求掌握快速排序函数的使用。

(11)清空通讯录中联系人的信息

//清空通讯中的信息
void Clear_Contacter(struct contact* ps)
{
	memset(ps->data, 0, sizeof(ps->data));
	ps->size = 0;
	printf("清空成功!\n");
}

分析:此处其实类似于初始化联系人的信息,就是将那段内存空间中的数据使用memset函数全部设置为0,然后将记录联系人数目的变量size设定为0。

4. 代码呈现(分文件实现)

(1)test.c

#include"contact.h"
enum Option
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	CLEAR,//6
	SORT//7
};
void menu()
{
	printf("************************************\n");
	printf("****  1.add         2.del       ****\n");
	printf("****  3.search      4.modify    ****\n");
	printf("****  5.show        6.clear     ****\n");
	printf("****  7.sort        0.exit      ****\n");
	printf("************************************\n");
}
//测试函数的功能
int main()
{
	//创建通讯录
	struct contact con;//con就是通讯录,里面包含1000个元素的数组和size
	//初始化通讯录
	Init_Contact(&con);
	int input = 0;
	int size = 0;//记录当前有多少人
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			//增加
			Add_Contacter(&con);
			break;
		case DEL:
			//删除
			Del_Contacter(&con);
			break;
		case SEARCH:
			//查找
			Find_Contacter(&con);
			break;
		case MODIFY:
			//修改
			Mod_Contacter(&con);
			break;
		case SHOW:
			//打印
			Print_Contacter(&con);
			break;
		case CLEAR:
			//清空
			Clear_Contacter(&con);
			break;
		case SORT:
			//排序
			Sort_Contacter(&con);
			break;
		case EXIT:
		    //退出
			printf("退出通讯录!\n");
			break;
		default:
			printf("选择错误,请重新输入!\n");
		}
	} while (input);
	return 0;
}

(2)contact.h

#pragma once
#define MAX_NUM 100
#define MAX_NAME 20
#define MAX_PHONE 12
#define MAX_SEX 5
#define MAX_ADDRESS 30
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct PeoInfo
{
	char name[MAX_NAME];
	char phone[MAX_PHONE];
	char sex[MAX_SEX];
	char address[MAX_ADDRESS];
	int age;
};
struct contact
{
	struct PeoInfo data[MAX_NUM];
	int size;//记录当前已经有的元素个数
};
//声明函数
//初始化通讯录的函数
void Init_Contact(struct contact* ps);
//增加一个信息到通讯录
void Add_Contacter(struct contact* ps);
//删除指定的联系人
void Del_Contacter(struct contact* ps);
//查找指定人的信息
void Find_Contacter(const struct contact* ps);
//修改指定人的信息
void Mod_Contacter(struct contact* ps);
//打印通讯录中的信息
void Print_Contacter(const struct contact* ps);
//对通讯录中的联系人进行排序
void Sort_Contacter(struct contact* ps);
//清空通讯录中的信息
void Clear_Contacter(struct contact* ps);

(3)contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//实现函数的功能
static int Find_byName(const struct contact* ps, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (0 == strcmp(ps->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
//初始化通讯录中的信息
void Init_Contact(struct contact* ps)
{
	memset(ps->data, 0, sizeof(ps->data));
	ps->size = 0;//设置通讯录最初只有0个元素
}
//添加通讯录中的信息
void Add_Contacter(struct contact* ps)
{
	if (ps->size == MAX_NUM)
	{
		printf("通讯录已满!无法继续增加!\n");
	}
	else
	{
		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].phone);
		printf("请输入地址:");
		scanf("%s", &ps->data[ps->size].address);

		ps->size++;
		printf("添加成功!\n");
	}
}
//删除通讯录中的信息
void Del_Contacter(struct contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你要删除的联系人的姓名:");
	scanf("%s", name);
	//查找要删除的人所在的位置
	//找到了返回名字所在元素的下标,没找到就返回-1
	int pos = Find_byName(ps,name);
	if (pos==-1)//删除的人不存在
	{
		printf("要删除的人不存在!\n");
	}
	else//删除
	{
		int j = 0;
		for (j = pos; j < ps->size-1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功!\n");
	}
}
//查找通讯录中的信息
void Find_Contacter(const struct contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你要查找的联系人的姓名:");
	scanf("%s", name);
	int pos = Find_byName(ps, 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", ps->data[pos].name,
			ps->data[pos].age,
			ps->data[pos].sex,
			ps->data[pos].phone,
			ps->data[pos].address);
	}
}
//修改通讯录中的信息
void Mod_Contacter(struct contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你要修改的联系人的姓名:");
	scanf("%s", name);
	int pos = Find_byName(ps, name);
	if (pos==-1)//修改的人不存在
	{
		printf("要修改的人不存在!\n");
	}
	else
	{
		printf("请输入名字:");
		scanf("%s", &ps->data[pos].name);
		printf("请输入年龄:");
		scanf("%d", &ps->data[pos].age);
		printf("请输入性别:");
		scanf("%s", &ps->data[pos].sex);
		printf("请输入电话:");
		scanf("%s", &ps->data[pos].phone);
		printf("请输入地址:");
		scanf("%s", &ps->data[pos].address);
		printf("修改成功!\n");
	}
}
//打印通讯录中的信息
void Print_Contacter(const struct contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空!\n");
	}
	else
	{
		//标题
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n",  "姓名", "年龄", "性别", "电话", "地址");
		int i = 0;
		while (i < ps->size)
		{
			//数据
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n", ps->data[i].name, 
				ps->data[i].age, 
				ps->data[i].sex, 
				ps->data[i].phone, 
				ps->data[i].address);
			i++;
		}
	}
}
//对通讯录中的信息进行排序
//排序函数
//1.按照姓名进行排序
int Conpare_ByName(const void *e1,const void *e2)
{
	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
}
//2.按照年龄进行排序
int Conpare_ByAge(const void* e1, const void* e2)
{
	return ((struct PeoInfo*)e1)->age-((struct PeoInfo*)e2)->age;
}
//3.按照住址进行排序
int Conpare_ByAddress(const void* e1, const void* e2)
{
	return strcmp(((struct PeoInfo*)e1)->address, ((struct PeoInfo*)e2)->address);
}
void Sort_Contacter(struct contact* ps)
{
	printf("请选择你想排序的方式:\n");
	printf("1.姓名\n2.年龄\n3.住址\n");
	int input = 0;
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		qsort(ps->data,ps->size,sizeof(ps->data[0]),Conpare_ByName);
		printf("排序成功\n");
		break;
	case 2:
		qsort(ps->data, ps->size, sizeof(ps->data[0]), Conpare_ByAge);
		printf("排序成功\n");
		break;
	case 3:
		qsort(ps->data, ps->size, sizeof(ps->data[0]), Conpare_ByAddress);
		printf("排序成功\n");
		break;
	}
}
//清空通讯中的信息
void Clear_Contacter(struct contact* ps)
{
	memset(ps->data, 0, sizeof(ps->data));
	ps->size = 0;
	printf("清空成功!\n");
}

  • 71
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 78
    评论
信息; 2) 使用双向链表作为通讯录的数据结构,能够进行信息的增删改查等操作; 3) 输入信息时,要进行合法性校验,如姓名不能为空,邮编必须为数字等; 4) 显示信息时,可以按照姓名、城市、国家等关键字进行排序显示; 5) 查找信息时,可以根据姓名进行精确查找,也可以根据城市、国家等关键字进行模糊查找; 6) 删除信息时,可以根据姓名进行精确删除,也可以根据城市、国家等关键字进行批量删除; 7) 存盘和装入功能可以将通讯录数据保存到文件中,方便下一次使用时加载数据。 以下是通讯录管理系统C语言实现代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 联系人结构体 typedef struct Contact { char name[50]; char street[50]; char city[50]; char zip[10]; char state[50]; struct Contact *prev; struct Contact *next; } Contact; // 全局变量,指向双向链表的头节点和尾节点 Contact *head = NULL; Contact *tail = NULL; // 函数声明 void enter(); void display(); void search(char *keyword); void delete(char *keyword); void save(); void load(); // 根据姓名比较两个联系人的大小 int compare_name(Contact *c1, Contact *c2) { return strcmp(c1->name, c2->name); } // 根据城市比较两个联系人的大小 int compare_city(Contact *c1, Contact *c2) { return strcmp(c1->city, c2->city); } // 根据国家比较两个联系人的大小 int compare_state(Contact *c1, Contact *c2) { return strcmp(c1->state, c2->state); } // 插入联系人到双向链表中 void insert(Contact *c) { if (head == NULL) { // 如果链表为空 head = tail = c; c->prev = c->next = NULL; } else { // 如果链表不为空 Contact *p = head; while (p != NULL && compare_name(p, c) < 0) { p = p->next; } if (p == NULL) { // 插入到链表末尾 c->prev = tail; c->next = NULL; tail->next = c; tail = c; } else { // 插入到链表中间 if (p->prev == NULL) { // 插入到链表头 c->prev = NULL; c->next = head; head->prev = c; head = c; } else { // 插入到链表中间 c->prev = p->prev; c->next = p; p->prev->next = c; p->prev = c; } } } } // 输入联系人信息 void enter() { Contact *c = (Contact *)malloc(sizeof(Contact)); printf("Enter name: "); fgets(c->name, 50, stdin); c->name[strcspn(c->name, "\n")] = 0; // 去掉末尾的换行符 printf("Enter street: "); fgets(c->street, 50, stdin); c->street[strcspn(c->street, "\n")] = 0; // 去掉末尾的换行符 printf("Enter city: "); fgets(c->city, 50, stdin); c->city[strcspn(c->city, "\n")] = 0; // 去掉末尾的换行符 printf("Enter zip: "); fgets(c->zip, 10, stdin); c->zip[strcspn(c->zip, "\n")] = 0; // 去掉末尾的换行符 printf("Enter state: "); fgets(c->state, 50, stdin); c->state[strcspn(c->state, "\n")] = 0; // 去掉末尾的换行符 insert(c); // 将联系人插入到双向链表中 printf("Contact has been added.\n"); } // 显示联系人信息 void display() { printf("%-20s %-20s %-20s %-10s %-20s\n", "Name", "Street", "City", "Zip", "State"); Contact *p = head; while (p != NULL) { printf("%-20s %-20s %-20s %-10s %-20s\n", p->name, p->street, p->city, p->zip, p->state); p = p->next; } } // 查找联系人信息 void search(char *keyword) { Contact *p = head; while (p != NULL) { if (strstr(p->name, keyword) != NULL || strstr(p->city, keyword) != NULL || strstr(p->state, keyword) != NULL) { printf("%-20s %-20s %-20s %-10s %-20s\n", p->name, p->street, p->city, p->zip, p->state); } p = p->next; } } // 删除联系人信息 void delete(char *keyword) { Contact *p = head; while (p != NULL) { Contact *next = p->next; if (strstr(p->name, keyword) != NULL || strstr(p->city, keyword) != NULL || strstr(p->state, keyword) != NULL) { if (p->prev == NULL) { // 删除头节点 head = p->next; if (head != NULL) { head->prev = NULL; } else { // 链表为空 tail = NULL; } } else if (p->next == NULL) { // 删除尾节点 tail = p->prev; tail->next = NULL; } else { // 删除中间节点 p->prev->next = p->next; p->next->prev = p->prev; } free(p); } p = next; } printf("Contact has been deleted.\n"); } // 存储联系人信息到文件中 void save() { FILE *fp = fopen("contacts.txt", "w"); Contact *p = head; while (p != NULL) { fprintf(fp, "%s,%s,%s,%s,%s\n", p->name, p->street, p->city, p->zip, p->state); p = p->next; } fclose(fp); printf("Contacts have been saved to file.\n"); } // 从文件中加载联系人信息 void load() { FILE *fp = fopen("contacts.txt", "r"); if (fp == NULL) { // 如果文件不存在,则创建一个空文件 fp = fopen("contacts.txt", "w"); fclose(fp); return; } char line[256]; while (fgets(line, 256, fp) != NULL) { Contact *c = (Contact *)malloc(sizeof(Contact)); char *token = strtok(line, ","); strcpy(c->name, token); token = strtok(NULL, ","); strcpy(c->street, token); token = strtok(NULL, ","); strcpy(c->city, token); token = strtok(NULL, ","); strcpy(c->zip, token); token = strtok(NULL, ","); strcpy(c->state, token); insert(c); // 将联系人插入到双向链表中 } fclose(fp); printf("Contacts have been loaded from file.\n"); } int main() { int choice; char keyword[50]; do { printf("Menu:\n"); printf("1. Enter a contact\n"); printf("2. Display all contacts\n"); printf("3. Search contacts\n"); printf("4. Delete contacts\n"); printf("5. Save contacts to file\n"); printf("6. Load contacts from file\n"); printf("0. Quit\n"); printf("Enter your choice: "); scanf("%d", &choice); getchar(); // 读取多余的换行符 switch (choice) { case 1: enter(); break; case 2: display(); break; case 3: printf("Enter keyword: "); fgets(keyword, 50, stdin); keyword[strcspn(keyword, "\n")] = 0; // 去掉末尾的换行符 search(keyword); break; case 4: printf("Enter keyword: "); fgets(keyword, 50, stdin); keyword[strcspn(keyword, "\n")] = 0; // 去掉末尾的换行符 delete(keyword); break; case 5: save(); break; case 6: load(); break; case 0: printf("Goodbye!\n"); break; default: printf("Invalid choice.\n"); break; } } while (choice != 0); return 0; } ``` 这个通讯录管理系统具有基本的增删改查功能,也实现了存盘和装入功能,可以将联系人信息保存到文件中,方便下一次使用时加载数据。
评论 78
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹿九丸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值