首先定义联系人结构体,通讯录存储有效个数以及结构体指针
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define MAX_name 5
#define MAX_sex 3
#define MAX_phone 15
typedef struct peoifo
{
char name[MAX_name];
int age;
char sex[MAX_sex];
char phone[MAX_phone];
}ifo;
typedef struct address
{
ifo* arr;
int size;
}address;
int menu(); //菜单函数
void Start_address(address* ptr); //初始化通讯录函数
void Addifo(address* p); //新建联系人
void Delifo(address* ptr); // 删除联系人
int Foundifo(const address* p); //查找通讯录联系人
void Printifo(const address* p); //打印通讯录
void Changeifo(address* p); //修改信息
void EXIT(address* ptr); //退出程序,保留数据
接下来实现各个函数
#define _CRT_SECURE_NO_WARNINGS
#include"函数定义.h"
int menu()
{
int num,n = 0; //num接受操作功能
do
{
if (n != 0)
{
printf("输入有误,请重新输入");
}
printf(" 通讯录功能如下: \n");
printf(" 1.新建联系人 2.删除联系人 3.查找联系人 4.修改信息 5.查看通讯录 0.退出程序 \n");
scanf("%d", &num);
n++;
} while (num>5||num<0);
return num;
}
void Start_address(address* ptr) //通讯录初始化
{
memset(ptr, 0, sizeof(address));
ptr->arr = (ifo*)malloc(sizeof(ifo));
FILE* fileptr = fopen("ifo.date", "r");
assert(fileptr);
for (int i=0;fread(ptr->arr+i,sizeof(ifo),1,fileptr);i++)
{
ptr->size++;
ptr->arr = (ifo*)realloc(ptr->arr, ((ptr->size) + 1) * sizeof(ifo));
}
fclose(fileptr);
fileptr = NULL;
}
void Addifo(address* p) //新建联系人
{
printf("姓名\n");
scanf("%s", p->arr[p->size].name);
printf("电话号码\n");
scanf("%s", p->arr[p->size].phone);
printf("年龄\n");
scanf("%d", &(p->arr[p->size].age));
printf("性别\n");
scanf("%s", p->arr[p->size].sex);
(p->size)++;
printf("导入成功 \n");
p->arr = (ifo*)realloc(p->arr, (p->size + 1) * sizeof(ifo));
Printifo(p);
}
void Delifo(address* ptr) //删除联系人
{
int ret=Foundifo(ptr); //先查找联系人,返回值小与0则联系人不存在
if (ret < 0)
{
return;
}
else
{
for (int i = ret;i<(ptr->size-1); i++)
{
ptr->arr[i] = ptr->arr[i + 1]; //通过覆盖删除元素
}
ptr->arr = (ifo*)realloc(ptr->arr, (ptr->size)*sizeof(ifo)); //重新开辟内存空间
ptr->size--; //联系人个人-1
memset(ptr->arr+(ptr->size), 0, sizeof(ifo)); //将内存中的最后一个元素初始化为0
Printifo(ptr);
}
}
int Foundifo(const address* p) //查找通讯录联系人
{
char arr[10] = { 0 }; //使用数组接受查找联系人姓名
printf("请输入联系人姓名");
scanf("%s", &arr);
int num = 0;
for (int x = 0; arr[x] != 0; x++) { num++; } //判断姓名的字节大小 以此来确定strncmp中n的大小
for (int i = 0; i < p->size; i++)
{
if (strncmp(arr, p->arr[i].name, num) == 0) //判断表达式
{
return i;
}
}
printf("无此人\n");
return -1;
}
void Printifo(const address* p) //打印通讯录
{
printf(" 姓 名 性别 年龄 电话号码 \n");
for (int i = 0; i < (p->size); i++)
{
printf(" %s %s %d %s \n", p->arr[i].name,
p->arr[i].sex,
p->arr[i].age,
p->arr[i].phone);
}
}
void Changeifo(address* p) //修改信息
{
printf("请输入修改信息用户的姓名");
int n = Foundifo(p);
if (n >= 0) {
int i = 0;
printf("姓名\n");
scanf("%s", p->arr[n].name);
printf("电话号码\n");
scanf("%s", p->arr[n].phone);
printf("年龄\n");
scanf("%d", &(p->arr[n].age));
printf("性别\n");
scanf("%s", p->arr[n].sex);
printf("修改成功 \n");
}
return;
}
void EXIT(address* p)
{
FILE* ptr = fopen("ifo.date", "w"); //打开文件
assert(ptr);
for (int i = 0; i < p->size; i++) //写入数据
{
fwrite(p->arr + i, sizeof(ifo), 1, ptr);
}
fclose(ptr); //关闭文件
ptr = NULL;
free(p->arr);
p = NULL;
}