提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、通讯录的实现

1.通讯录需要的库函数以及各种功能的自定义函数声明(contact.h)

2.自定义函数实现模块(contact.c)

2.通讯录测试模块(text.c)


前言

接上次的动态通讯录,实现通讯录信息的长期存储

一、通讯录的实现

1.通讯录需要的库函数以及各种功能的自定义函数声明(contact.h)

代码如下:

#pragma once#define DEFAULT_SZ 3
#define INC_SZ 2
#define NAME 20
#define SEX 5
#define BIRTHDAY 9
#define PHONE 11
#define ADDRESS 20#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>//通讯录成员信息结构体
typedef struct Peo {char name[NAME];char sex[SEX];char birthday[BIRTHDAY];char phone[PHONE];char address[ADDRESS];
}Peo_inma;//通讯录结构体静态版本
//typedef struct Contact {
//  Peo_inma data[MAX_COUNT];
//  int count;
//}Contact;//通讯录结构体动态版本
typedef struct Contact {Peo_inma* data;int count;int MAX;
}Contact;//打印菜单
void menu();//加载文件信息到通讯录
int LoadContact(Contact* p);//通讯录的初始化
int InitContact(Contact* p);//通讯录增容
int IncreaseContact(Contact* p);//增加联系人
void AddContact(Contact* p);//删除联系人
void DelContact(Contact* p);//查找当前联系人
void FindContact(Contact* p);//修改联系人
void ModifyContact(Contact* p);//显示当前通讯录信息
void ShowContact(Contact* p);//对当前通讯录信息进行升序排序
void SortContact(Contact* p);//存储通讯录
void SaveContact(const Contact* p);//销毁通讯录,释放内存空间
void Destroy(Contact* p);

2.自定义函数实现模块(contact.c)

代码如下:

#define _CRT_SECURE_NO_WARNINGS#include "contact.h"//通讯录增容
int IncreaseContact(Contact* p) {if (p->count == p->MAX) {Peo_inma* ptr = NULL;ptr = realloc(p->data, (p->MAX + INC_SZ) * sizeof(Peo_inma));if (ptr == NULL) {perror("IncreaseContact");return 1;}else {p->data = ptr;ptr = NULL;p->MAX += INC_SZ;printf("增容成功\n");return 0;}}
}//加载文件信息到通讯录
int LoadContact(Contact* p) {FILE* pfr = fopen("test.txt", "r");if (pfr == NULL) {perror("InitContact");return 1;}//读取失败时会返回EOF,不返回0while (fscanf(pfr, "%s %s %s %s %s", p->data[p->count].name,p->data[p->count].sex,p->data[p->count].birthday,p->data[p->count].phone,p->data[p->count].address) != EOF){p->count++;IncreaseContact(p);}fclose(pfr);pfr = NULL;return 0;
}//打印菜单
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 InitContact(Contact* p) {assert(p);p->count = 0;p->data = (Peo_inma*)calloc(DEFAULT_SZ, sizeof(Peo_inma));if (p->data == NULL) {printf("InitContact : %s\n", strerror(errno));return 1;}p->MAX = DEFAULT_SZ;//加载文件的信息到通讯录if (LoadContact(p) == 1) {return 1;}return 0;
}//增加联系人
void AddContact(Contact* p) {assert(p);//增容if (IncreaseContact(p) == 1){return;}printf("请输入姓名:>");scanf("%s", p->data[p->count].name);printf("请输入性别:>");scanf("%s", p->data[p->count].sex);printf("请输入年龄:>");scanf("%s", p->data[p->count].birthday);printf("请输入电话:>");scanf("%s", p->data[p->count].phone);printf("请输入地址:>");scanf("%s", p->data[p->count].address);p->count++;
}//删除联系人
void DelContact(Contact* p) {assert(p);if (p->count == 0) {printf("通讯录为空,删除失败\n");return;}int i = 0;char str[NAME] = { 0 };int peo = 0;int sz = 0;int j = 0;sz = sizeof(p->data[0]);char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };printf("0.姓名, 1.性别, 2.生日, 3.电话号码, 4.地址\n");printf("请选择属性编号来删除联系人:>");scanf("%d", &peo);printf("请输入被删除人信息:");scanf("%s", str);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");for (i = 0; i < p->count; i++) {if (strcmp(Peo[peo] + (i * sz), str) == 0) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);for (j = i; j < p->count - 1; j++) {p->data[j] = p->data[j + 1];}i--;p->count--;}}printf("以上联系人信息均被删除\n");
}//查询联系人
void FindContact(Contact* p) {assert(p);if (p->count == 0) {printf("通讯录为空\n");return;}int i = 0;char str[NAME] = { 0 };int peo = 0;int sz = 0;sz = sizeof(p->data[0]);char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };printf("0.姓名, 1.性别, 2.生日, 3.电话号码, 4.地址\n");printf("请选择属性编号来查找联系人:>");scanf("%d", &peo);printf("请输入被搜索人信息:");scanf("%s", str);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");for (i = 0; i < p->count; i++) {if (strcmp(Peo[peo] + (i * sz), str) == 0) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);}}//Search(p,Peo[peo],sizeof(p->data[0]));
}//修改联系人信息
void ModifyContact(Contact* p) {assert(p);if (p->count == 0) {printf("通讯录为空\n");return;}int i = 0;char str[NAME] = { 0 };int peo = 0;int sz = 0;int input = 0;sz = sizeof(p->data[0]);char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };printf("0.姓名, 1.性别, 2.生日, 3.电话号码, 4.地址\n");printf("请选择属性编号来修改联系人:>");scanf("%d", &peo);printf("请输入被修改人原信息:");scanf("%s", str);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");for (i = 0; i < p->count; i++) {if (strcmp(Peo[peo] + (i * sz), str) == 0) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);printf("请选择是否修改: 1.是 0.否  :>");scanf("%d", &input);if (input) {printf("请输入姓名:>");scanf("%s", p->data[i].name);printf("请输入性别:>");scanf("%s", p->data[i].sex);printf("请输入年龄:>");scanf("%s", p->data[i].birthday);printf("请输入电话:>");scanf("%s", p->data[i].phone);printf("请输入地址:>");scanf("%s", p->data[i].address);}}}
}//显示当前通讯录信息
void ShowContact(Contact* p) {assert(p);printf("%-10s%-5s%-10s%-11s%-10s\n", "姓名", "性别", "生日", "电话号码", "地址");int i = 0;for (i = 0; i < p->count; i++) {printf("%-10s%-5s%-10s%-11s%-10s\n", p->data[i].name,p->data[i].sex,p->data[i].birthday,p->data[i].phone,p->data[i].address);}
}int compar(const void* e1, const void* e2) {return strcmp((char*)e1, (char*)e2);
}//对当前通讯录进行升序排序
void SortContact(Contact* p) {assert(p);qsort(p->data, p->count, sizeof(p->data[0]), compar);printf("升序排序完成\n");
}//存储通讯录
void SaveContact(const Contact* p) {assert(p);FILE* pfw = fopen("test.txt","w");if (pfw == NULL) {perror("SaveContact:");return;}//写文件-以结构化的形式写int i = 0;for (; i < p->count; i++) {fprintf(pfw,"%s %s %s %s %s\n",p->data[i].name, p->data[i].sex, p->data[i].birthday, p->data[i].phone, p->data[i].address);}fclose(pfw);pfw = NULL;
}//销毁通讯录
void Destroy(Contact* p) {free(p->data);p->data = NULL;
}

2.通讯录测试模块(text.c)

#define _CRT_SECURE_NO_WARNINGS#include "contact.h"//枚举
enum Peo_con_option {Exit,Add,    //增加DEL,    //删除SEARCH, //搜索MODIFY, //修改SHOW,   //打印SORT    //排序
};int main() {int input = 0;Contact Con;if (InitContact(&Con) == 1)return 1;do {menu();printf("请选择:>");scanf("%d", &input);switch (input) {case Add:AddContact(&Con);break;case DEL:DelContact(&Con);break;case SEARCH:FindContact(&Con);break;case MODIFY:ModifyContact(&Con);break;case SHOW:ShowContact(&Con);break;case SORT:SortContact(&Con);break;case Exit:SaveContact(&Con);Destroy(&Con);printf("退出\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

C语言实现动态通讯录版本二相关推荐

  1. C语言版动态通讯录(增、删、改、查(查重)、去重、排序、导出)

    C语言版动态通讯录(增.删.改.查(查重).去重.排序.导出) 一段学习过后,想写小东西加深下印象和理解,便开始了我的动态通讯录之旅. 整体框架及实现 通讯录主体 typedef struct con ...

  2. C语言实现动态通讯录(附带文件保存)

    ✅作者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!

  3. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)

    前言 : 在生活中我们经常会遇到通讯录的使用,比如存进一个新的联系人的信息,或者对其删除,修改,查找:那这些神奇的功能是如何实现的?我们不禁好奇.今天,这篇博文将教会大家实现一个静态的或者动态的通讯录 ...

  4. C语言文件操作+通讯录实现文件操作

    文章目录 前言 一.为什么使用文件 二.什么是文件 三.文件的打开和关闭 四.文件的顺序读写 五.文件的随机读写 六.文本文件和二进制文件 七.文件读取结束的判定 八.文件缓冲区 前言 电脑文件,也可 ...

  5. C语言实现通讯录【二】(动态内存开辟,文件数据存储)

    C语言实现通讯录[二] 在C语言实现通讯录[一]的基础上进行优化,主要实现两大模块: 动态内存开辟 文件数据存储 动态内存开辟: 考虑到通讯录的大小无法固定,在C语言实现通讯录[一]版本上定义一个足够 ...

  6. C语言小项目——通讯录的存储系统(静态版,动态版,文件版)

    目录 前言 一.总体设计框架 二.三种通讯录的功能阐述 三.静态通讯录 1.结构体设计 2.初始化通讯录 3.增加联系人的信息 4.删除联系人的信息 5.查找指定联系人并打印 6.修改联系人的信息 7 ...

  7. 【C语言进阶】C语言程序设计:动态通讯录(顺序表实现)

    目录 动态通讯录的实现 一.实验的目的和意义 二.实验内容描述 三.功能描述 四.数据结构 1.三大模块 2.结构设计 3.动态开辟 4.文件操作 5.主要函数 五.流程图及模块算法 1.Contac ...

  8. c语言malloc用法 数组,详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include int main() { c ...

  9. C语言如何动态申请空间(一维和二维)

    C语言如何动态申请一维和二维空间呢? 这里有个小例子,看过后就很容易理解 编译环境为vs2013 #include <stdio.h> #include <stdlib.h> ...

最新文章

  1. 纯JavaScript实现弹出选择第几个单选按钮
  2. python函数知识四 迭代器、生成器
  3. [python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱
  4. 实战Jquery(一)--username校验
  5. 搭建Windows server 2008 R2 KMS
  6. 轻松上云系列之二:其他云数据迁移至阿里云
  7. GLTF格式——关系描述
  8. android线程改变布局,Android线程中设置控件的值提示报错的解决方法
  9. Android-创建简单登陆界面
  10. 无聊的时候去火箭队官网调戏客服
  11. 计算机二级Java笔记/重难点易错点总结(按章节归纳整理)
  12. 【计算机视觉】pycharm自制一个吉他扒谱软件(附源码)
  13. 跟着杨中科学习asp.net之html
  14. 基于微信小程序的网上购物系统的设计与实现.pdf
  15. python生成树状图_用 python 将思维导图转换成树形列表
  16. Python将PDF转换为图片
  17. 如何查看手机APP的包名,并卸载
  18. 微信小程序存在的风险_微信小程序开发技术风险存在,如何规避是重点
  19. python画三维(3D)图
  20. 【无标题】ensp华为基础配置命令

热门文章

  1. 嵌入式系统的启动过程
  2. oracle sga的作用,SGA主要哪些部分,主要作用
  3. 瑞萨单片机CAN口复用唤醒
  4. 六款主流ETL工具介绍及功能对比
  5. WordPress主题 知更鸟Begin V5.2版响应式个人博客源码
  6. Hadoop文件存储格式
  7. 墨刀导出html5文案不能复制,如何写出优秀的交互文案? 8种技巧大分享!
  8. mysql正确关闭slave取消主从
  9. python中英文翻译模块
  10. 计算机主机加固之防范勒索病毒