C语言如何简单通讯录功能
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要介绍了C语言如何简单通讯录功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下1.存放联系人信息2.信息:名字+
千家信息网最后更新 2025年02月08日C语言如何简单通讯录功能
这篇文章主要介绍了C语言如何简单通讯录功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
具体内容如下
1.存放联系人信息
2.信息:名字+年龄+性别+电话+住址
3.增加联系人
4.删除联系人
5.查找联系人
6.修改联系人
7.排序
test.c源文件代码如下:
#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"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");}//创建一个枚举类型,分别对应菜单选项enum Option{ EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT,};int main(){ int input = 0; //创建一个通讯录 struct Contact con; //初始化通讯录 InitContact(&con); //最多可以放3个联系人信息 //空间不够再增容 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 SORT: SortContact(&con); break; case EXIT: SaveContact(&con); //销毁通讯录 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 CheckCapacity(struct Contact* pc){ //断言 assert(pc); if (pc->sz == pc->capacity)//如果有效联系人等于最大容纳量 { //增加容量 struct PeoInfo* ptr = realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo)); if (ptr != NULL)//如果不为空,表示增容成功 { pc->data = ptr; pc->capacity += 2; printf("增容成功\n"); } else { perror("AddContact::realloc"); return; } }}//加载有效联系人信息void LoadContact(struct Contact* pc){ assert(pc); struct PeoInfo tmp = { 0 };//临时空间 FILE* pfRead = fopen("contact.txt", "rb");//打开文件,读取数据 if (NULL == pfRead) { perror("open file for reading"); return; } //加载数据 //每次读取一个联系人信息,直到frea返回值小于1,表示读取完毕,循环结束 while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead)) { CheckCapacity(pc); pc->data[pc->sz] = tmp; pc->sz++; } //关闭文件 fclose(pfRead); pfRead = NULL;//置空,防止变成野指针}//初始化通讯录void InitContact(struct Contact* pc){ assert(pc); pc->sz = 0; pc->capacity = DEFAULT; pc->data = (struct PeoInfo*)malloc(DEFAULT * sizeof(struct PeoInfo));//动态申请空间 if (pc->data == NULL) { perror("InitContact::malloc"); return; } LoadContact(pc);//加载通讯录的信息}//增加联系人void AddContact(struct Contact* pc){ assert(pc); CheckCapacity(pc);//检查容量是否为满,是则进行增容 //输入增加指定联系人的信息 printf("请输入名字:>"); scanf("%s", pc->data[pc->sz].name); printf("请输入年龄:>"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入性别:>"); scanf("%s", pc->data[pc->sz].sex); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:>"); scanf("%s", pc->data[pc->sz].addr); printf("添加成功\n"); pc->sz++;//有效联系人加1}//销毁通讯录void DestroyContact(struct Contact* pc){ assert(pc); free(pc->data);//释放申请的动态内存空间 pc->data = NULL;//置为空指针 pc->capacity = 0;//容量置0 pc->sz = 0;//有效联系人置0}//显示通讯录信息void ShowContact(const struct Contact* pc){ assert(pc); int i = 0; printf("%20s\t%5s\ts\ts\t%50s\n\n", "name", "age", "sex", "tele", "addr"); for (i = 0; i < pc->sz; i++) { //打印每一个数据 printf("%20s\t%5d\ts\ts\t%50s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr); }}//查找指定联系人int FindContactByName(const struct Contact* pc, const char* name){ assert(pc && name); int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { return i; } } //找不到 return -1;}//删除指定联系人void DelContact(struct Contact* pc){ assert(pc); if (pc->sz == 0) { printf("通讯录为空,无法删除\n"); return; } char name[NAME_MAX] = { 0 }; printf("请输入要删除联系人的名字:>"); scanf("%s", name); //查找到删除的人 int pos = FindContactByName(pc, name); if (pos == -1) printf("指定联系人不存在\n"); else { //删除 int i = 0; for (i = pos; i < pc->sz-1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("成功删除\n"); } }//查找指定联系人void SearchContact(const struct Contact* pc){ assert(pc); char name[NAME_MAX] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无法查找\n"); return; } printf("请输入要查找的联系人名字:>"); scanf("%s", name); int pos = FindContactByName(pc, name); if (-1 == pos) printf("查无此人\n"); else { printf("s\t%5s\t%8s\ts\t%30s\n\n", "name", "age", "sex", "tele", "addr"); printf("s\t%5d\t%8s\ts\t%30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr); }}//修改指定联系人void ModifyContact(struct Contact* pc){ assert(pc); char name[NAME_MAX] = { 0 }; if (pc->sz == 0) { printf("通讯录为空,无法修改\n"); return; } printf("请输入要修改的联系人名字:>"); scanf("%s", name); int pos = FindContactByName(pc, name); if (-1 == pos) printf("要修改的人不存在\n"); else { printf("请输入新的名字:>"); scanf("%s", pc->data[pos].name); printf("请输入新的年龄:>"); scanf("%d", &(pc->data[pos].age)); printf("请输入新的性别:>"); scanf("%s", pc->data[pos].sex); printf("请输入新的电话:>"); scanf("%s", pc->data[pos].tele); printf("请输入新的地址:>"); scanf("%s", pc->data[pos].addr); }}//按照名字排序->升序int cmp_by_name(const void* e1, const void* e2){ return strcmp((((struct PeoInfo*)e1)->name), (((struct PeoInfo*)e2)->name));}//按照年龄排序->升序int cmp_by_age(const void* e1, const void* e2){ return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;}//排序通讯录void SortContact(struct Contact* pc){ assert(pc); int input = 0; if (pc->sz == 0) { printf("通讯录为空,无法排序\n"); return; } printf("按名字排序请输入1,年龄排序请输入2:>"); scanf("%d", &input); if (1 == input) { //名字排序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_name); } else { //年龄排序 qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_age); }}//保存通讯录void SaveContact(struct Contact* pc){ assert(pc); int i = 0; FILE* pfWrite = fopen("contact.txt", "wb");把当前程序的有效联系人写入文件 if (NULL == pfWrite)//判断是否为空指针 { perror("open file for writting"); return; } //写数据 for (i = 0; i < pc->sz; i++) { fwrite(pc->data+i, sizeof(struct PeoInfo), 1, pfWrite);//进行写入 } fclose(pfWrite);//关闭文件 pfWrite = NULL;//置为空指针}
contact.h头文件代码如下:
#pragma once#include#include #include #include #define DEFAULT 3#define NAME_MAX 20#define SEX_MAX 10#define TELE_MAX 12#define ADDR_MAX 50#define MAX 1000//描述联系人的信息struct PeoInfo{ char name[NAME_MAX]; int age; char sex[SEX_MAX]; char tele[TELE_MAX]; char addr[ADDR_MAX];};//通讯录-动态增长版本struct Contact{ struct PeoInfo* data; int sz;//通讯录中当前有效元素个数 int capacity;//通讯录的当前最大容量};//增容void CheckCapacity(struct Contact* pc);//初始化通讯录void InitContact(struct Contact* pc);//销毁通讯录void DestroyContact(struct Contact* pc);//增加联系人void AddContact(struct Contact* pc);//显示通讯录void ShowContact(const struct Contact* pc);//删除指定联系人void DelContact(struct Contact* pc);//查找指定联系人void SearchContact(const struct Contact* pc);//修改指定联系人void ModifyContact(struct Contact* pc);//排序通讯录void SortContact(struct Contact* pc);//保存通讯录到文件void SaveContact(struct Contact* pc);//加载通讯录void LoadContact(struct Contact* pc);
程序运行:
重新运行程序并显示
之前添加的联系人会存放在指定文件中,再次运行程序会加载进去,增容成功是因为默认容纳的联系人有3位,要加载4位联系人,所以自动进行增容。
感谢你能够认真阅读完这篇文章,希望小编分享的"C语言如何简单通讯录功能"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
联系人
联系
通讯
通讯录
输入
排序
信息
名字
文件
有效
年龄
成功
容量
指针
数据
程序
空间
篇文章
代码
动态
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
三门峡库存管理软件开发
深圳纵横软件开发有限公司
管家婆正确的服务器ip
互联网商业时代的科技创业新思维
重庆超级玛丽网络技术
供电软件开发技术
软件开发过程全封闭
重庆联通服务器租用哪里有
b站上网络安全的博主
网络安全监测装置通过率
四川大学网络安全实验报告
斗罗大陆手游各服务器排行
mstar数据库下载
国家网络安全宣传板报一
软件开发的研发费用比例
vb 数据库 表格数据
江苏人工智能软件开发多少钱
杨浦区专业软件开发试验设备
设备管理数据库
日文 数据库 乱码
山东恒邦网络技术
三门峡库存管理软件开发
中国网络安全协议调查
新丝路大唐无双服务器玩法介绍
宝塔服务器多少钱一个月
两台电脑需不需要服务器
临空港国家网络安全中心项目
sap 服务器安装
macos创建数据库
河南软件开发排名