8.基于C语言的通讯录管理系统

news/2025/2/5 20:38:29/文章来源:https://www.cnblogs.com/lotuslaw/p/18700103
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define NAME_LENGTH           16
#define FILE_NAME_LENGTH      128
#define PHONE_LENGTH          32
#define BUFFER_LENGTH         128
#define MIN_TOKEN_LENGHT      5#define INFO                  printf#define LIST_INSERT(item, list) do {          \item->prev = NULL;                        \item->next = list;                        \if ((list) != NULL) (list)->prev = item;  \(list) = item;                            \
} while(0)#define LIST_REMOVE(item, list) do {                         \if (item->prev != NULL) item->prev->next = item->next;   \if (item->next != NULL) item->next->prev = item->prev;   \if (list == item) list = item->next;                     \item->prev = item->next = NULL;                          \
} while(0)struct person {char name[NAME_LENGTH];char phone[PHONE_LENGTH];struct person *next;struct person *prev;
};struct contacts {struct person *people;int count;
};enum {OPER_INSERT = 1,OPER_PRINT,OPER_DELETE,OPER_SEARCH,OPER_SAVE,OPER_LOAD
};// define interface
int person_insert(struct person **ppeople, struct person *ps) {if (ps == NULL) return -1;LIST_INSERT(ps, *ppeople);return 0;
}int person_delete(struct person **ppeople, struct person *ps) {if (ps == NULL) return -1;if (ppeople == NULL) return -2;LIST_REMOVE(ps, *ppeople);return 0;}struct person* person_search(struct person *people, const char *name) {struct person *item = NULL;for (item = people; item != NULL; item = item->next) {if (!strcmp(name, item->name))break;}return item;
}int person_traversal(struct person *people) {struct person *item = NULL;for (item = people; item != NULL; item = item->next) {INFO("name: %s, phone: %s\n", item->name, item->phone);}return 0;}int save_file(struct person *people, const char *filename) {FILE *fp = fopen(filename, "w");if (fp == NULL) return -1;struct person *item = NULL;for (item = people; item !=  NULL; item = item->next) {fprintf(fp, "name: %s, phone: %s\n", item->name, item->phone);fflush(fp);}fclose(fp);return 0;
}int parser_token(char *buffer, int length, char *name, char *phone) {if (buffer == NULL) return -1;if (length < MIN_TOKEN_LENGHT) return -2;int i = 0, j = 0, status = 0;for (i=0; buffer[i] != ','; i++) {if (buffer[i] == ' ') {status = 1;} else if (status == 1) {name[j++] = buffer[i];}}status = 0;j = 0;for (; i < length; i++) {if (buffer[i] == ' ') {status = 1;} else if (status == 1) {phone[j++] = buffer[i];}}INFO("file toen : %s --> %s\n", name, phone);return 0;
}int load_file(struct person **ppeople, int *count, const char *filename) {FILE *fp = fopen(filename, "r");if (fp == NULL) return -1;while (!feof(fp)) {char buffer[BUFFER_LENGTH] = {0};fgets(buffer, BUFFER_LENGTH, fp);int length = strlen(buffer);INFO("length : %d\n", length);// name: aaa,telephone: 123char name[NAME_LENGTH] = {0};char phone[PHONE_LENGTH] = {0};if (0 != parser_token(buffer, length, name, phone)) continue;struct person *p = (struct person*)malloc(sizeof(struct person));if (p == NULL) return -2;memcpy(p->name, name, NAME_LENGTH);memcpy(p->phone, phone, PHONE_LENGTH);person_insert(ppeople, p);(*count)++;}fclose(fp);return 0;}// endint insert_entry(struct contacts *cts) {if (cts == NULL) return -1;struct person *p = (struct person*)malloc(sizeof(struct person));if (p == NULL) return -2;memset(p, 0, sizeof(struct person));// nameINFO("Please Input Name: \n");scanf("%s", p->name);// phoneINFO("Please Input Phone: \n");scanf("%s", p->phone);// add peopleif (0 != person_insert(&cts->people, p)) {free(p);return -3;}cts->count++;INFO("Insert Success\n");return 0;
}int print_entry(struct contacts *cts) {if (cts == NULL) return -1;person_traversal(cts->people);
}int delete_entry(struct contacts *cts) {if (cts == NULL) return -1;INFO("Please Input Name : \n");char name[NAME_LENGTH] = {0};scanf("%s", name);// personstruct person *ps = person_search(cts->people, name);if (ps == NULL) {INFO("Person does not exist\n");return -2;}INFO("name: %s, phone: %s\n", ps->name, ps->phone);// deleteperson_delete(&cts->people, ps);free(ps);return 0;
}int search_entry(struct contacts *cts) {if (cts == NULL) return -1;INFO("Please Input Name: \n");char name[NAME_LENGTH] = {0};scanf("%s", name);// personstruct person *ps = person_search(cts->people, name);if (ps == NULL) {INFO("Person does not exist\n");return -2;}INFO("name: %s, phone: %s\n", ps->name, ps->phone);return 0;
}int save_entry(struct contacts *cts) {if (cts == NULL) return -1;INFO("Please Input Save Filename: \n");char filename[FILE_NAME_LENGTH] = {0};scanf("%s", filename);save_file(cts->people, filename);
}int load_entry(struct contacts *cts) {if (cts == NULL) return -1;INFO("Please Input Load Filename:\n");char filename[FILE_NAME_LENGTH] = {0};scanf("%s", filename);load_file(&cts->people, &cts->count, filename);
}void menu_info(void) {INFO("\n\n********************************************************\n");INFO("***** 1. Add Person\t\t2. Print People ********\n");INFO("***** 3. Del Person\t\t4. Search Person *******\n");INFO("***** 5. Save People\t\t6. Load People *********\n");INFO("***** Other Key for Exiting Program ********************\n");INFO("********************************************************\n\n");
} int main() {struct contacts *cts = (struct contacts*)malloc(sizeof(struct contacts));if (cts == NULL) return -1;memset(cts, 0, sizeof(struct contacts));while (1) {menu_info();int select = 0;scanf("%d", &select);switch (select){case OPER_INSERT:insert_entry(cts);break;case OPER_PRINT:print_entry(cts);break;case OPER_DELETE:delete_entry(cts);break;case OPER_SEARCH:search_entry(cts);break;case OPER_SAVE:save_entry(cts);break;case OPER_LOAD:load_entry(cts);break;default:goto exit;}}
exit:free(cts);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879250.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的Selenium详细教程

本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术:Python、HTML、CSS、JavaScript一、PyCharm安装配置Selenium本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0需要你懂的技术:Python、HTML、CSS、Java…

作业01

public class HomeWork01 {public static void main(String[] args) {int n1 = 13;int n2 = 17;int n3 = n1+n2;System.out.println("n3 = "+ n3);//30int n4 = 38;int n5 = n4-n3;System.out.println("n5 ="+n5);//8}}

CROS错误,xhr类型

解决方案:向Web.config里添加此项设置即可

2025省选模拟9

不知道啥2025省选模拟9 网络流专场是吧😅 Delov 的 npy 们 原题链接 一眼网络流,然后不会了。 发现正常顺着限制做做不了,考虑将限制转化一下,以 L 操作为例。 在 \(a_i\) 左侧的点中不超过 \(b_i\) 个,等价于从左往右数第 \(b_i+1\) 个点在 \(a_i\) 右侧。 但还是不好做…

海外社交媒体运营卡成狗?云手机一键“救场”

海外社交媒体运营卡成狗?云手机一键“救场” 在海外社交媒体运营中,运营人员往往会遇到各种挑战,导致运营效率低下,甚至感觉“卡成狗”。而云手机作为一种流行的成熟普及技术工具,可以为海外社交媒体运营带来一定的帮助,实现一键“救场”。以下是对云手机在海外社交媒体运…

MyBatis resultmap结果映射

创建数据库和实体类 首先创建数据库student和teacher,并且每个学生对应一个老师,一个老师可以对应多个学生,数据库如下图: 创建实体类Student1 package com.loubin.pojo;2 3 public class Student {4 private int id;5 private String name;6 7 Teacher teach…

Linguistics-English-Textbooks: 上海外教社: 高校英语专业系列教材(修订版)

新世纪高校英语专业系列教材(修订版) https://we.sflep.com/books/newcenturymajor1.aspx教材特色 配套资源 特点 秉以新《国标》指导下的英语专业课程改革为导向精心架构,体系完备。 凝聚海内外英语专业教育界专家学者智慧,教材编写高屋建瓴、深入 浅出. 兼顾语言基本技能…

OCRmyPDF: 让图片 PDF 可复制、搜索的神器

翻开十年前的工作报告,面对泛黄的纸质合同,整理成摞的文献资料 - 这些场景总离不开扫描仪,将纸张材料转成 PDF 扫描件电子版。 但生成的 PDF 文件像一张张定格照片,既不能复制文字,也无法搜索关键词。 图片 今天推荐的开源项目:OCRmyPDF 专治各种"哑巴PDF"。它…

10. 正则表达式

一、什么是正则表达式正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅…

独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的

通过 Docker 环境变量,在启动容器时带入配置信息,自动写入配置文件中,完全免去了进入容器内部 vim 修改的步骤,真正实现在线客服系统1分钟上线。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上…

线段树详解

授人以鱼不如授人以渔本文尽量详细地讲述线段树的引入,实现,应用,以及相关进阶知识。 引入 引入线段树通用的例子: 给定一组整数\(nums\),定义两种操作修改列表里的第\(i\)个数据为\(val\) ①查询区间和\([L,R]\) ②为了同时实现两种操作,现在考虑处理\(nums\)的方式 简单…