【C语言】如何实现一个简单的通讯录(含代码)

❤️欢迎来到我的博客❤️

在上篇文章中,我们了解了结构体,那我们能不能用结构体来做一些事情呢?
可以,本篇文章将给大家讲解通讯录的实现方式。

通讯录的基本功能

那么要做一个通讯录,我们要了解通讯录中会包含哪些内容:

通讯录:

  1. 人的信息:姓名+年龄+性别+地址+电话
  2. 通讯录中可以存放100个人的信息
  3. 需要提供的功能:增加联系人,删除指定联系人,查找指定联系人的信息,修改指定联系人的信息,显示所有联系人的信息。
    了解完通讯录的基本功能,我们就可以来实现一个简单的通讯录。

通讯录的实现

我们将创建3个文件,分别是:

test.c - 测试通讯录
contact.c - 通讯录的实现
contact.h - 函数的声明

菜单框架

首先我们得先做一个通讯录菜单,用来实现我们上述提到的各种功能。

void menu()
{
	printf("**************************************************\n");
	printf("*******               通讯录               *******\n");
	printf("*******     1.添加联系人  2.删除联系人     *******\n");
	printf("*******     3.查找联系人  4.修改联系人     *******\n");
	printf("*******     5.显示联系人  0.退出通讯录     *******\n");
	printf("**************************************************\n");
}
int main()
{
	int input = 0;
	do
	{	
		menu();//菜单
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

菜单的逻辑和之前讲解过的小游戏一致。

结构体的定义和声明

通讯录里要包含人的信息,而人的信息有姓名+年龄+性别+地址+电话这几个部分构成,那么我们就得封装成一个结构体。
那么我们的结构体类型就得定义在头文件中(contact.h) 因为在其他文件中也可能使用到信息。

contact.h:

#pragma once

#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

//人的信息
typedef struct PeoInfo//重命名为PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

那么我们的通讯录中如何才能放下100个人的信息?

我们回到test.c文件中,包含一下contact.h的头文件,然后在主函数中创建一个数组:

#include "contact.h"

PeoInfo data[100];

这样就可以存放100个人的信息了,光有信息还不行,我们还得知道我们的通讯录中放了多少个人的信息。

#include "contact.h"

//创建通讯录
PeoInfo data[100];
//表示通讯录当前放了多少个人的信息
int sz;

如果我们这样写,数据就会比较分散,那我们能不能把这些变量再封装成一个结构体呢?

当然可以,我们回到contact.h中:

#pragma once

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

//人的信息
typedef struct PeoInfo//重命名为PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

typedef struct Contact//重命名为Contact
{
	PeoInfo data[MAX];//存放人的信息的
	int sz;//当前已放信息的个数
}Contact;

这样我们就可以在主函数中创建Contact的结构体,结构体中包含了人的信息和存放个数。

创建和初始化通讯录

我们需要细致的初始化,所以我们封装一个初始化函数来实现初始化功能。

test.c:

int input = 0;
//添加代码在input下方
//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);

contact.h:

void InitContact(Contact* pc);//函数声明

初始化函数的实现我们放在Contact.c中:

void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));//初始化所有字节为0
}

接下来我们就可以开始实现功能了。

添加联系人功能的实现

我们创建一个函数,里面包含添加联系人的功能,并在头文件中声明。

test.c:

	case 1:
		AddContact(&con);
		break;

contact.h:

//添加联系人
void AddContact(Contact* pc);

功能的实现我们放在contact.c中:

void AddContact(Contact* pc)
{
	assert(pc);
	//判断通讯录是否为满
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法增加\n");
		return;
	}
	//增加联系人信息
	printf("请输入名字->");
	scanf("%s", pc->data[pc->sz].name);//数组名是地址,不需要&
	printf("请输入年龄->");
	scanf("%d", &(pc->data[pc->sz].age));//age是变量,需要&
	printf("请输入性别->");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址->");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话->");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;
}

这样我们增加联系人的功能就实现了。

运行效果:
在这里插入图片描述

显示通讯录中的信息

有了添加联系人功能,那我们接下来就做一个显示通讯录的功能,来测试我们的添加功能是否能正常实现。

一样是封装成一个函数:
test.c

	case 5:
		ShowContact(&con);
		break;

contact.h

//显示通讯录的信息
void ShowContact(const Contact* pc);

contact.c

//只打印不会修改内容,所以最好加上const
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;

	//打印表头,宽度和下方一致,注意第二个为%-4s
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字","年龄", "性别", "地址", "电话");

	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		//左对齐数据更美观
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n",  pc->data[i].name, 
													 pc->data[i].age, 
													 pc->data[i].sex, 
													 pc->data[i].addr, 
													 pc->data[i].tele);
	}
}

运行效果:
在这里插入图片描述

删除指定联系人

我们得先让用户输入一个名字,然后再在通讯录中查找用户输入的名字,暂不考虑同名情况。
删除的实现我们用一个最普通的方法:
在这里插入图片描述

代码如下:
test.c:

case 2:
			DelContact(&con);
			break;

contact.h:

//删除指定联系人
void DelContact(Contact* pc);

contact.c:

void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	//判断通讯录里是否有数据
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字->");
	scanf("%s", name);
	int i = 0;
	int del = 0;//记录查找位置

	//寻找通讯录中名字相同的信息,暂时不考虑同名情况
	for (i = 0; i < pc->sz; i++)
	{
		//名字相等,找到了
		if (strcmp(pc->data[i].name, name) == 0)
		{
			del = i;
			break;
		}
	}
	//删除
	for (i = del; i < pc->sz - 1; i++);
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

运行效果:
在这里插入图片描述

可以看到,删除功能已经实现完成。

我们思考一下,后面的步骤:修改联系人和查找联系人都和删除联系人有一个共同的功能:查找,那我们不妨把查找功能封装成一个函数。

优化如下:

int FindByName(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;

	//寻找通讯录中名字相同的信息,暂时不考虑同名情况
	for (i = 0; i < pc->sz; i++)
	{
		//名字相等,找到了
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	//判断通讯录里是否有数据
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字->");
	scanf("%s", name);
	//通过名字查找
	int ret = FindByName(pc,name);//找到返回下标,找不到返回-1
	//判断是否找到
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");//找不到则提示找不到
		return;
	}
	int i = 0;
	//找到后进行删除
	for (i = ret; i < pc->sz - 1; i++);
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

查找联系人

contact.h:

//查找指定联系人
void SearchContact(const Contact* pc);

test.c:

	case 3:
		SearchContact(&con);
		break;

contact.c:

//查找联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找的人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("未查找到指定的联系人\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}

FindByName函数:

int FindByName(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;

	//寻找通讯录中名字相同的信息,暂时不考虑同名情况
	for (i = 0; i < pc->sz; i++)
	{
		//名字相等,找到了
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

运行效果:
在这里插入图片描述

修改指定联系人

修改指定联系人首先得查找到联系人,那么可以沿用上面的查找代码。
而修改信息其实就是我们一开始做的添加联系人的操作,那么我们同样也可以沿用上面的添加联系人的代码。
复制粘贴时注意修改下标

contact.h:

//修改指定联系人
void ModifyContact(Contact* pc);

test.c:

	case 4:
		ModifyContact(&con);
		break;

contact.c:

void ModifyContact(Contact* pc)
{
	assert(pc);
	//查找信息
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	//修改信息
	//增加联系人信息
	printf("请输入名字->");
	scanf("%s", pc->data[pos].name);//数组名是地址,不需要&
	printf("请输入年龄->");
	scanf("%d", &(pc->data[pos].age));//age是变量,需要&
	printf("请输入性别->");
	scanf("%s", pc->data[pos].sex);
	printf("请输入地址->");
	scanf("%s", pc->data[pos].addr);
	printf("请输入电话->");
	scanf("%s", pc->data[pos].tele);

	printf("修改完成\n");
}

运行效果:
在这里插入图片描述

在这里插入图片描述

总体代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()
{
	printf("**************************************************\n");
	printf("*******               通讯录               *******\n");
	printf("*******     1.添加联系人  2.删除联系人     *******\n");
	printf("*******     3.查找联系人  4.修改联系人     *******\n");
	printf("*******     5.显示联系人  0.退出通讯录     *******\n");
	printf("**************************************************\n");
}
int main()
{
	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:
			ModifyContact(&con);
			break;
		case 5:
			ShowContact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

//初始化函数
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

//添加联系人
void AddContact(Contact* pc)
{
	assert(pc);
	//判断通讯录是否为满
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法增加\n");
		return;
	}
	//增加联系人信息
	printf("请输入名字->");
	scanf("%s", pc->data[pc->sz].name);//数组名是地址,不需要&
	printf("请输入年龄->");
	scanf("%d", &(pc->data[pc->sz].age));//age是变量,需要&
	printf("请输入性别->");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址->");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话->");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;
}


//查找函数
int FindByName(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;

	//寻找通讯录中名字相同的信息,暂时不考虑同名情况
	for (i = 0; i < pc->sz; i++)
	{
		//名字相等,找到了
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc)
{
	assert(pc);

	char name[NAME_MAX] = { 0 };
	//判断通讯录中是否有数据
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	//通过名字查找
	int ret = FindByName(pc, name);//找到返回下标,找不到返回-1
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");
		return;
	}

	int i = 0;
	//删除
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找的人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("未查找到指定的联系人\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}

//打印联系人
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;

	//打印表头,宽度和下方一致,注意第二个为%-4s
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字","年龄", "性别", "地址", "电话");

	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		//左对齐数据更美观
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n",  pc->data[i].name, 
													 pc->data[i].age, 
													 pc->data[i].sex, 
													 pc->data[i].addr, 
													 pc->data[i].tele);
	}
}

void ModifyContact(Contact* pc)
{
	assert(pc);
	//查找信息
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	//修改信息
	//增加联系人信息
	printf("请输入名字->");
	scanf("%s", pc->data[pos].name);//数组名是地址,不需要&
	printf("请输入年龄->");
	scanf("%d", &(pc->data[pos].age));//age是变量,需要&
	printf("请输入性别->");
	scanf("%s", pc->data[pos].sex);
	printf("请输入地址->");
	scanf("%s", pc->data[pos].addr);
	printf("请输入电话->");
	scanf("%s", pc->data[pos].tele);

	printf("修改完成\n");
}

contact.h

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

//人的信息
typedef struct PeoInfo//重命名为PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

typedef struct Contact//重命名为Contact
{
	PeoInfo data[MAX];//存放人的信息的
	int sz;//当前已放信息的个数
}Contact;

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

//添加联系人
void AddContact(Contact* pc);

//删除指定联系人
void DelContact(Contact* pc);

//显示通讯录的信息
void ShowContact(const Contact* pc);

//查找指定联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);

以上就是我们简单的通讯录的实现方式,因为我们的通讯录还是比较简单的一个通讯录,所以在当前通讯录中只能存放100个人的信息,并且这些信息并没有存储到文件里面去,当我们下一次运行此程序的时候,数据就全部丢失了,这些信息都是存放在内存中的,并没有持久化的保存,那么持久化的保存方式后期我会给大家做详细的讲解。

动态版本

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()
{
	printf("**************************************************\n");
	printf("*******               通讯录               *******\n");
	printf("*******     1.添加联系人  2.删除联系人     *******\n");
	printf("*******     3.查找联系人  4.修改联系人     *******\n");
	printf("*******     5.显示联系人  0.退出通讯录     *******\n");
	printf("**************************************************\n");
}

enum Option//选项
{
	//枚举常量,默认从0开始
	EXIT,//0.退出通讯录
	ADD,//1.添加联系人
	DEL,//2.删除联系人
	SEARCH,//3.查找联系人
	MODIFY,//4.修改联系人
	SHOW//5.显示联系人
};

int main()
{
	int input = 0;
	//创建通讯录
	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 EXIT:
			//退出通讯录之前销毁通讯录
			DestroyContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

静态版本
初始化函数
//void InitContact(Contact* pc)
//{
//	assert(pc);
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//}

//动态版本
//初始化函数
void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	PeoInfo * ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
	//判断是否开辟成功
	if (ptr == NULL)
	{
		perror("InitContact::calloc");
		return;
	}
	pc->data = ptr;
	pc->capacity = DEFAULT_SZ;
}

//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
	pc = NULL;
}
 
//静态版本
添加联系人
//void AddContact(Contact* pc)
//{
//	assert(pc);
//	//判断通讯录是否为满
//	if (pc->sz == MAX)
//	{
//		printf("通讯录已满,无法增加\n");
//		return;
//	}
//	//增加联系人信息
//	printf("请输入名字->");
//	scanf("%s", pc->data[pc->sz].name);//数组名是地址,不需要&
//	printf("请输入年龄->");
//	scanf("%d", &(pc->data[pc->sz].age));//age是变量,需要&
//	printf("请输入性别->");
//	scanf("%s", pc->data[pc->sz].sex);
//	printf("请输入地址->");
//	scanf("%s", pc->data[pc->sz].addr);
//	printf("请输入电话->");
//	scanf("%s", pc->data[pc->sz].tele);
//
//	pc->sz++;
//}


void check_capacity(Contact* pc)
{
	//判断通讯录是否为满
	if (pc->sz == pc->capacity)
	{
		//增加容量
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(PeoInfo));
		//判断增容是否成功
		if (ptr == NULL)
		{
			perror("check_capacity::relloc");
			return;
		}
		pc->data = ptr;
		pc->capacity += INC_SZ;
		printf("增容成功\n");
	}
}

//动态版本
void AddContact(Contact* pc)
{
	assert(pc);
	check_capacity(pc);


	//增加联系人信息
	printf("请输入名字->");
	scanf("%s", pc->data[pc->sz].name);//数组名是地址,不需要&
	printf("请输入年龄->");
	scanf("%d", &(pc->data[pc->sz].age));//age是变量,需要&
	printf("请输入性别->");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入地址->");
	scanf("%s", pc->data[pc->sz].addr);
	printf("请输入电话->");
	scanf("%s", pc->data[pc->sz].tele);

	pc->sz++;
}


//查找函数
int FindByName(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;

	//寻找通讯录中名字相同的信息,暂时不考虑同名情况
	for (i = 0; i < pc->sz; i++)
	{
		//名字相等,找到了
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc)
{
	assert(pc);

	char name[NAME_MAX] = { 0 };
	//判断通讯录中是否有数据
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s", name);
	//通过名字查找
	int ret = FindByName(pc, name);//找到返回下标,找不到返回-1
	if (-1 == ret)
	{
		printf("要删除的人不存在\n");
		return;
	}

	int i = 0;
	//删除
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找联系人
void SearchContact(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找的人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("未查找到指定的联系人\n");
		return;
	}
	//找到了,打印信息
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,
												pc->data[pos].age,
												pc->data[pos].sex,
												pc->data[pos].addr,
												pc->data[pos].tele);
}

//打印联系人
void ShowContact(const Contact* pc)
{
	assert(pc);
	int i = 0;

	//打印表头,宽度和下方一致,注意第二个为%-4s
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字","年龄", "性别", "地址", "电话");

	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		//左对齐数据更美观
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n",  pc->data[i].name, 
										pc->data[i].age, 
										pc->data[i].sex, 
										pc->data[i].addr, 
										pc->data[i].tele);
	}
}

void ModifyContact(Contact* pc)
{
	assert(pc);
	//查找信息
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字\n");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	//修改信息
	//增加联系人信息
	printf("请输入名字->");
	scanf("%s", pc->data[pos].name);//数组名是地址,不需要&
	printf("请输入年龄->");
	scanf("%d", &(pc->data[pos].age));//age是变量,需要&
	printf("请输入性别->");
	scanf("%s", pc->data[pos].sex);
	printf("请输入地址->");
	scanf("%s", pc->data[pos].addr);
	printf("请输入电话->");
	scanf("%s", pc->data[pos].tele);

	printf("修改完成\n");
}

contact.h

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12



#define DEFAULT_SZ 3//默认大小
#define INC_SZ 2//每次增容量

//人的信息
typedef struct PeoInfo//重命名为PeoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}PeoInfo;

静态版本(空间是固定的)
//typedef struct Contact//重命名为Contact
//{
//	PeoInfo data[MAX];//存放人的信息的
//	int sz;//当前已放信息的个数
//}Contact;

//动态版本
typedef struct Contact//重命名为Contact
{
	PeoInfo* data;//指向存放人的信息的
	int sz;//当前已放信息的个数
	int capacity;//当前通讯录的最大容量
}Contact;

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

//销毁通讯录
void DestroyContact(Contact* pc);

//添加联系人
void AddContact(Contact* pc);

//删除指定联系人
void DelContact(Contact* pc);

//显示通讯录的信息
void ShowContact(const Contact* pc);

//查找指定联系人
void SearchContact(const Contact* pc);

//修改指定联系人
void ModifyContact(Contact* pc);


以上就是本篇文章的全部内容了,希望大家看完能有所收

❤️创作不易,点个赞吧❤️
  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值