[c语言]通讯录进阶版(实现动态内存以及文件操作)

C语言实现通讯录管理系统(文件操作版本) 阅读详情

正文

本文将在上次的基础版本上实现进阶功能
可以实现动态内存分配
可以实现文件操作(保存之后,下次打开程序,上次存储的信息依然在)
包含联系人姓名,性别,年龄,电话,家庭住址等信息
可以实现以下功能
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人
8.清屏
9.完成操作自动保存
10.程序打开开始加载
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct PersonInfo //创建个人信息结构体
{
	 char name[1024];
	 char sex[1024];
	 char age[1024];
	 char phone[1024];
	 char address[1024];
}PersonInfo;

typedef struct AddrBook  //通讯录
{
	 PersonInfo *person_info;  //通讯录人数数组
	 int size;//实际联系人数量
	 int capacity; //动态数组最大值,最大联系人数量
}AddrBook;

AddrBook g_addr_book;//创建一个通讯录类型的全局变量
void Init()
{
	 int i = 0;
	 g_addr_book.size = 0;
	 //capacity的值
	 g_addr_book.capacity = 2;
	 //分配动态内存(此处malloc不需要free,因为此处的PersonInfo是全局变量,生命周期是整个程序)
	 g_addr_book.person_info = 
	  (PersonInfo *)malloc(sizeof(PersonInfo) * g_addr_book.capacity);
}

//扩容
void CheckRealloc()
{
	 if (g_addr_book.size < g_addr_book.capacity)
	 {
		  //不需要扩容
		  return;
	 }
	 g_addr_book.capacity *= 2;
	 PersonInfo *temp = (PersonInfo *)malloc(sizeof(PersonInfo) * g_addr_book.capacity);
	 for (int i = 0; i < g_addr_book.size; i++)
	 {
	 	 temp[i] = g_addr_book.person_info[i];//把之前的person_info的内容放在temp中
	 }
	 free(g_addr_book.person_info);//释放动态内存分配之前person_info中的内容
	 g_addr_book.person_info = temp;//再把temp中的内容放在新分配内存的person_info中
}

void AddPersonInfo()
{
	 //判断是否扩容
	 CheckRealloc();
	 printf("请输入联系人信息\n");
	 printf("请输入联系人名:\n");
	 scanf("%s", g_addr_book.person_info[g_addr_book.size].name);
	 printf("请输入联系人性别:\n");
	 scanf("%s", g_addr_book.person_info[g_addr_book.size].sex);
	 printf("请输入联系人年龄:\n");
	 scanf("%s", g_addr_book.person_info[g_addr_book.size].age);
	 printf("请输入联系人电话号码:\n");
	 scanf("%s", g_addr_book.person_info[g_addr_book.size].phone);
	 printf("请输入联系人地址:\n");
	 scanf("%s", g_addr_book.person_info[g_addr_book.size].address);
	 g_addr_book.size++;
	 printf("添加成功\n");
	 return;
}
void DelPersonInfo()
{
	 int num = 0;
	 int count = 0;
	 printf("删除联系人信息\n");
	 printf("请输入要删除人的编号\n");
	 scanf("%d",&num);
	 while (num < 0 || num >= g_addr_book.size)
	 {
		  printf("输入的编号超出范围,请重新输入\n");
		  scanf("%d", &num);
	 }
	 if (num != g_addr_book.size - 1)
	 {
		  strcpy(g_addr_book.person_info[num].name,
		   g_addr_book.person_info[g_addr_book.size - 1].name);
		  strcpy(g_addr_book.person_info[num].phone,
		   g_addr_book.person_info[g_addr_book.size - 1].sex);
		  strcpy(g_addr_book.person_info[num].sex,
		   g_addr_book.person_info[g_addr_book.size - 1].age);
		  strcpy(g_addr_book.person_info[num].age,
		   g_addr_book.person_info[g_addr_book.size - 1].phone);
		  strcpy(g_addr_book.person_info[num].address,
		   g_addr_book.person_info[g_addr_book.size - 1].address);
	 }
	 g_addr_book.size--;
	 count++;
	 printf("删除成功,共删除了%d条信息\n",count);
	 return;
}
void FindPersonInfo()
{
	 printf("查找联系人:\n");
	 printf("请输入联系人姓名:\n");
	 char name[1024] = {0};
	 int count = 0;
	 scanf("%s",name);
	 for (int i = 0; i < g_addr_book.size; i++)
	 {
		  if (0 == strcmp(name, g_addr_book.person_info[i].name))
		  {
			   printf("找到一条记录,性别为:%s,年龄为:%s,电话号码为:%s,家庭住址为:%s\n",
			    g_addr_book.person_info[i].sex,g_addr_book.person_info[i].age,
			    g_addr_book.person_info[i].phone,g_addr_book.person_info[i].address);
			   count++;
		  }
	 }
	 if (0 == count)
	 {
	 	 printf("未找到相关信息\n");
	 }
	 else
	 {
	 	 printf("查找成功,共查找到%d条记录\n",count);
	 }
}
void ModifyPersonInfo()
{
	 printf("修改联系人信息\n");
	 printf("请输入要修改人的编号:\n");
	 int num = 0;
	 scanf("%d",&num);
	 while (num < 0 || num >= g_addr_book.size)
	 {
		  printf("输入编号超出范围,请重新输入:\n");
		  scanf("%d",&num);
	 }
	 printf("请输入新的联系人姓名:\n");
	 scanf("%s",g_addr_book.person_info[num].name);
	 printf("请输入新的联系人性别:\n");
	 scanf("%s", g_addr_book.person_info[num].sex);
	 printf("请输入新的联系人年龄:\n");
	 scanf("%s", g_addr_book.person_info[num].age);
	 printf("请输入新联系人的电话号码:\n");
	 scanf("%s",g_addr_book.person_info[num].phone);
	 printf("请输入新的联系人家庭住址:\n");
	 scanf("%s", g_addr_book.person_info[num].address);
	 printf("修改成功\n");
}
void DisplayPersonInfo()
{
	 printf("打印所有联系人信息\n");
	 for (int i = 0; i < g_addr_book.size; i++)
	 {
		  printf("编号:[%d] 姓名:[%s] 性别:%s 年龄:%s  电话号码:%s 家庭住址:%s\n",
		   i,g_addr_book.person_info[i].name,
		   g_addr_book.person_info[i].sex, g_addr_book.person_info[i].age,
		   g_addr_book.person_info[i].phone,g_addr_book.person_info[i].address);
	 }
	 printf("打印完成,共打印了%d条信息\n",g_addr_book.size);
}
void ClearPersonInfo()
{
	 printf("清除所有用户信息!\n");
	 printf("你是否确定要删除所有信息? y:确认删除,按其他键取消删除\n");
	 char input[1024] = { 0 };
	 scanf("%s",input);
	 if (0 != strcmp(input, "y")) 
	 {
		  printf("已取消删除操作!\n");
		  return;
	 }
	 else
	 {
		  g_addr_book.size = 0;
		  printf("清除完成!\n");
	 }
}
void SortPersonInfo()
{
	 printf("将联系人进行排序\n");
	 for (int i = 0; i < g_addr_book.size - 1; i++)//冒泡排序
	 {
		  for (int j = 0; j < g_addr_book.size - i - 1; j++)
		  {
			   if (strcmp(g_addr_book.person_info[j].name,
			    g_addr_book.person_info[j + 1].name) > 0)
			   {
				    PersonInfo temp = g_addr_book.person_info[j];
				    g_addr_book.person_info[j] =
				     g_addr_book.person_info[j + 1];
				    g_addr_book.person_info[j + 1] = temp;
			   }
		   }
	}
	printf("排序完成!\n");
	DisplayPersonInfo();
	return;
}
//程序退出前保存
void SavePersonInfo()
{
	 printf("开始保存!\n");
	 FILE *fp = fopen("../test.txt","w"); //此处文件的地址为当前相对路径的上一级路径
	 if (fp == NULL)
	 {
		  printf("文件打开失败!保存失败!\n");
		  return;
	 }
	 for (int i = 0; i < g_addr_book.size; i++)
	 {
	 	 fwrite(&g_addr_book.person_info[i],sizeof(PersonInfo),1,fp);
	 }
	 fclose(fp);
	 printf("保存成功!保存了%d条信息\n",g_addr_book.size);
}
//程序开始前加载
void LoadPersonInfo()
{
	 printf("开始加载!\n");
	 FILE *fp = fopen("../test.txt","r");
	 if (fp == NULL)
	 {
		  printf("文件打开失败!加载失败!\n");
		  return;
	 }
	 PersonInfo temp = { 0 };
	 while (fread(&temp, sizeof(temp), 1, fp))
	 {
		  CheckRealloc();
		  g_addr_book.person_info[g_addr_book.size] = temp;
		  g_addr_book.size++;
	 }
	 fclose(fp);
	 printf("加载成功!加载了%d条信息\n",g_addr_book.size);
}
int menu()
{
	 int input = 0;
	 printf("&&&&&&&&&&&&&&&&&&&&&&&&\n");
	 printf("1.添加联系人信息\n");
	 printf("2.删除指定联系人信息\n");
	 printf("3.查找指定联系人信息\n");
	 printf("4.修改指定联系人信息\n");
	 printf("5.显示所有联系人信息\n");
	 printf("6.清空所有联系人\n");
	 printf("7.以名字排序所有联系人\n");
	 printf("8.清屏\n");
	 printf("0.退出\n");
	 printf("&&&&&&&&&&&&&&&&&&&&&&&&\n");
	 scanf("%d", &input);
	 while (input < 0 || input > 8)
	 {
		  printf("输入有误,请重新输入:\n");
		  scanf("%d", &input);
	 }
	 return input;
}
	
enum
{
	 EXIT,    //退出
	 ADD,    //添加
	 DEL,    //删除
	 FIND,    //查找
	 MODIFY,    //修改
	 DISPLAY,   //显示
	 CLEAR,     //清空
	 SORT,    //排序
	 CLEAN,    //清屏
};

int main()
{
	 int choice = 0;
	 Init();//初始化通讯录变量
	 LoadPersonInfo();//初始化完就要加载
	 while (1)
	 {
		  choice = menu();
		  switch (choice)
		  {
			  case EXIT:
				   SavePersonInfo();
				   printf("已退出\n");
				   system("pause");
				   return 0;
				   break;
			  case ADD:
				   AddPersonInfo();
				   SavePersonInfo();
				   break;
			  case DEL:
				   DelPersonInfo();
				   SavePersonInfo();
				   break;
			  case FIND:
				   FindPersonInfo();
				   break;
			  case MODIFY:
				   ModifyPersonInfo();
				   SavePersonInfo();
				   break;
			  case DISPLAY:
				   DisplayPersonInfo();
				   break;
			  case CLEAR:
				   ClearPersonInfo();
				   SavePersonInfo();
				   break;
			  case SORT:
				   SortPersonInfo();
				   SavePersonInfo();
				   break;
			  case CLEAN:
				   system("cls");
				   break;
		  }
	 }
	system("pause");
	return 0;
}
C语言实现通讯录管理系统(动态内存分配版) 阅读详情

相关推荐

C语言通讯录详解(进阶版)

C语言详解通讯录动态内存(malloc)版本

hu_143的博客 2183

C语言简单实现通讯录

一、整体思路      1.需要一个结构体,用来表示人的基本信息,再需要一个结构体用来存放人的基本信息,声明一个结构体的全局变量访问结构体成员。      2.定义一个枚举enum,表示通讯录各种执行的操作,用户选择时调用对应的函数。      3.主要的函数:结构体的初始化函数,通讯录的增、删、改、查、显示、退出、清除函数,通讯录用文件的保存、加载函数。      4.main函数:按步...

Sun_student的博客 5757

c语言通讯录

用c语言实现通讯录功能,增删查改,利用动态内存可以扩大通讯录的存储空间

【C语言】 实现通讯录(使用动态内存存储)

实现一个通讯录 通讯录可以用来存储联系人的信息,每个人的信息包括: 姓名、性别、年龄、电话、住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 text.c中的代码: #define _CRT...

spaceman_c的博客 750

新华硕笔记本ubuntu18.04双系统安装之后,wifi没有显示无法链接wifi

本来我以为跟简单安装一个wifi网卡的驱动就可以解决的问题,没想到花了我一早上的时候解决… 惭愧。 另外,本来是没打算写这篇博客的,但是我在搜索解决这个问题的过程中, 发现多人提出的解决方案跟我的都不一样,甚至我的解决方案都没有搜到相应的答案,还是只能靠自己啊。。 言归正传,还是说说怎么正确的安装wifi驱动吧! 1. wifi没有正确安装、或没有正确配置的表现 我的电脑现象: 有wifi图标, wifi设置上显示unaviable,无法搜索到任何wifi; 还有其他类似的表现,大家可以看看其他朋友的提

Ian的博客 1889

保姆级教程:用QSTEM和DrProbe搞定你的第一张STEM模拟图(附Fe3O4实例文件)

本文提供了一份详细的STEM模拟图像生成教程,涵盖从晶体结构获取到最终图像模拟的全过程。通过QSTEM和DrProbe软件的操作指南,帮助材料科学研究者快速掌握STEM模拟技术,特别适合初学者。教程包含Fe3O4实例文件,详细解析参数设置、计算优化和结果分析等关键步骤。

weixin_33730836的博客 523

【c】在C语言中使用顺序表了实现一个通讯录,实现对联系人信息的增删改查(主要用到动态开辟内存,文件读写,结构体指针)

头文件 #pragma once enum menu { EXIT, ADD, DEL, MODIFY, SEARCH, SORT, EMPTY, SHOW }; #define NAME_SIZE 30 #define SEX_SIZE 5 #define ADDR_SIZE 100 #define TEL_SIZE 20 #define MAX 3 typedef stru...

mysterious superstar 1356

ISCC练习题MISC

解题技巧:看最后括号应该是IceCTF,先用了一键解码啥也没有啊,不对不对!好像是字符频率统计,转换网站:http://quipqiup.com/有人给你发了一串信息,你能解开吗?

m0_62737381的博客 1119

【C语言进阶16——通讯录(基础版、动态内存版、文件管理版)】

前言 本文将实现一个通讯录,对前面所学的**指针、字符串库函数、结构体、动态内存、文件操作**等内容进行巩固和复习,**通讯录的内容有三个版本**: - **基本版** - **动态内存版** - **文件操作版**

taibudong1991的博客 1704

修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案

1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage...

qq_33835957的博客 7万+

图形推理2-四大类六提示

图形推理笔记2

小y的学习笔记 6739

C语言实现通讯录(文件版)

前言: 目录 一.动态保存版的好处 二.fread和fwrite函数详解 三.如何保存通讯录的信息 四.再次打开时,如何加载通讯录的信息 五.源码 Contact.c Contact.h test.c 一.动态保存版的好处 //通讯录成员 struct PeoInfo { char name[NAME_MAX]; char add[ADD_MAX]; char sex[SEX_MAX]; char tel[TEL_MAX]; int age; }; //动态通讯录 str

chuxinchangcun的博客 5816

智能车图像处理16-进阶篇8--右环岛状态机与补线

这篇文章主要讲述智能车竞赛中如何判断右环岛并且进行状态补线。

taiyuezyh的博客 1万+

你是真的“C”——详解C语言实现文件版通讯录

详解C语言实现文件版通讯录

小梦的博客 4229

【手把手教学】YOLOv13的Dilated Reparam Block (DRB) 实现细节与优化技巧

DRB(Dilated Reparam Block)是一种创新的卷积神经网络模块,通过多分支膨胀卷积和结构重参数化技术显著提升模型性能。训练阶段使用不同膨胀率和卷积核大小的并行分支增强特征提取能力,推理阶段则将这些分支融合为单一高效的大核卷积。该方法成功解决了大核卷积的计算复杂度和训练困难等问题,在保持推理效率的同时,使模型准确率提升8.56%,mAP暴涨12.33%。DRB的核心在于训练时复杂、推理时简单的设计哲学,以及膨胀卷积的多尺度特征提取能力,为CNN性能优化提供了新的思路。

FJN110的博客 556

12S BMS 核心设计:基于 STM32H743+BQ34Z100 的 SOC/SOH 实现与全链路技术解析(上)

本文详细介绍了基于STM32H743和BQ34Z100的12串锂电池管理系统(BMS)设计。该系统采用主控制器+专用电量监测计架构,可实现高精度SOC(±1%)和SOH(±2%)估算,支持36V-50.4V电压范围。硬件设计包括电压/电流采样、温度测量、保护电路等模块,软件实现基于HAL库开发,采用DMA方式提高I2C通信效率。系统通过TI专利的ImpedanceTrack™算法实现三维融合估算,并具备完善的保护功能。该设计适用于电动工具、轻型电动车等中功率设备,具有精度高、响应快。

bother3000的博客 1393

【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化

动态内存管理的函数有:malloc,calloc,ralloc,free,本文讲解动态内存函数和使用,如何进行动态内存管理,实现通讯录联系人容量的动态化,对常见动态内存错误进行总结。

2302_79491024的博客 6976

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言进阶之通讯录的实现(静态版和动态版)以及动态内存管理

malloc和freeC语言提供了一个动态内存开辟的函数:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。C语言提供了另外一个函数free。

立志做一个高产且细节博主 670

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C语言进阶】【小项目】实现一个通讯录【C语言知识点汇总项目】通过这个项目,掌握C语言重要知识点

【C语言项目】包含C语言学习阶段大部分知识点,巩固扎实C语言编程,干货满满的宝藏级别详解通讯录的实现,错过必后悔系列篇~

系统编程、网络编程 5343

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C进阶:通讯录(动态版本 + 文件操作)附源码

C进阶:万字详解通讯录(动态版本 + 文件操作)附源码

旋律 | 话语 | 色彩 | 情景 18万+

【进阶C语言】动态版通讯录的实现(详细讲解+全部码源)

动态版通讯录的实现(详细讲解+全部码源)我们要在静态版本的通讯录是进行功能的改造和升级,所用框架静态版通讯录一样,相较于静态的实现,两者的差别并不大,前者是用一个固定数组来实现元素的,储存后者则是用动态申请的内存来实现储存,优点是可以节省内存区别在于通讯录的初始化

m0_75058342的博客 3923

【进阶C语言】静态版通讯录的实现(详细讲解+全部源码)

静态版通讯录的实现(详细讲解+全部源码),内含各种程序过程详细介绍

m0_75058342的博客 2万+

C语言课设——通讯录(静态、动态、文件三版合一)

相信每个科班的同学都有过C语言课设的经历,比如教职工工资管理系统、图书信息管理系统、学生信息管理系统、通讯录系统等,其实这些课设任务的底层逻辑都是一致的,无非就是对结构体变量进行增删查改操作,同时配合文件操作将数据保存在文件夹中,本文将以通讯录举例,从静态版到文件版,让大家明白通讯录系统是如何逐步完善的。

北 海的博客 3018

C语言——通讯录

纯C语言实现通讯录

m0_72165281的博客 1万+

【C语言】—— 通讯录

通讯录(结构体+动态内存管理+文件)

M的博客 1万+
上一篇: [c语言]实现通讯录基础版
下一篇: [C语言]数据结构之顺序表
coolnut12138
博客等级 码龄9年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值