如何用C语言编写一个简易的通讯录程序?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2243个文字,预计阅读时间需要9分钟。
本文以实例形式分享了C语言实现简易通讯录的代码,供大家参考。主要包括以下内容:
一、概述简易通讯录是一种基本的数据存储工具,用于存储和查询联系人信息。本文将介绍如何使用C语言实现一个简易的通讯录程序。
二、通讯录的实现通讯录的实现主要包括以下几个方面:
1. 指针:用于动态分配内存,存储联系人信息。
2.结构体:定义联系人信息的数据结构。
3.动态内存管理:包括内存的分配、释放等操作。
4.文件的读写操作:将通讯录信息保存到文件,并从文件中读取。
三、代码示例
以下是一个简易通讯录的代码示例:c#include #include
// 定义联系人信息结构体typedef struct { char name[50]; char phone[20];} Contact;
// 函数声明void addContact(Contact **contacts, int *size);void deleteContact(Contact **contacts, int *size);void listContacts(Contact *contacts, int size);void saveContacts(Contact *contacts, int size);void loadContacts(Contact **contacts, int *size);
int main() { Contact *contacts=NULL; int size=0;
// 加载通讯录信息 loadContacts(&contacts, &size);
// 用户交互 int choice; do { printf(1. 添加联系人\n); printf(2. 删除联系人\n); printf(3. 查看联系人\n); printf(4. 保存通讯录\n); printf(5. 退出\n); printf(请输入操作选项:); scanf(%d, &choice);
switch (choice) { case 1: addContact(&contacts, &size); break; case 2: deleteContact(&contacts, &size); break; case 3: listContacts(contacts, size); break; case 4: saveContacts(contacts, size); break; case 5: printf(退出程序。\n); break; default: printf(无效选项,请重新输入。\n); } } while (choice !=5);
// 释放内存 free(contacts); return 0;}
// 添加联系人void addContact(Contact **contacts, int *size) { Contact *new_contacts=realloc(contacts, (*size + 1) * sizeof(Contact)); if (new_contacts==NULL) { printf(内存分配失败。\n); return; } contacts=new_contacts;
printf(请输入联系人姓名:); scanf(%s, contacts[*size].name); printf(请输入联系人电话:); scanf(%s, contacts[*size].phone); (*size)++;}
// 删除联系人void deleteContact(Contact **contacts, int *size) { int index; printf(请输入要删除的联系人序号:); scanf(%d, &index); if (index =*size) { printf(无效的联系人序号。\n); return; }
Contact *new_contacts=realloc(contacts, (*size - 1) * sizeof(Contact)); if (new_contacts==NULL) { printf(内存分配失败。\n); return; } for (int i=index; i < *size - 1; i++) { new_contacts[i]=contacts[i + 1]; } free(contacts); contacts=new_contacts; (*size)--;}
// 查看联系人void listContacts(Contact *contacts, int size) { for (int i=0; i // 保存通讯录void saveContacts(Contact *contacts, int size) { FILE *file=fopen(contacts.txt, w); if (file==NULL) { printf(文件打开失败。\n); return; } for (int i=0; i // 加载通讯录void loadContacts(Contact **contacts, int *size) { FILE *file=fopen(contacts.txt, r); if (file==NULL) { printf(文件打开失败。\n); return; } char name[50], phone[20]; while (fscanf(file, %s,%s\n, name, phone) !=EOF) { Contact *new_contacts=realloc(contacts, (*size + 1) * sizeof(Contact)); if (new_contacts==NULL) { printf(内存分配失败。\n); return; } contacts=new_contacts; strcpy(contacts[*size].name, name); strcpy(contacts[*size].phone, phone); (*size)++; } fclose(file);} 本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 一、概述 通讯录的实现其中包括了指针、结构体、动态内存管理、文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子; 通讯录功能如下: 二、代码如下 contact.h
#ifndef CONTACT_H
#define CONTACT_H
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 20
#define MEMBER_MAX 1
typedef struct info
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TEL_MAX];
char addr[ADDR_MAX];
}info;
typedef struct contact
{
info *data;
int size;
int capacity;
}contact, *pcontact;
//初始化通讯录
void InitContact(pcontact list);
//添加联系人
void AddContact(pcontact list);
//删除联系人
void DellContact(pcontact list);
//查找联系人
void FindContact(pcontact list);
//修改联系人
void ModContact(pcontact list);
//显示所有联系人
void ShowContact(pcontact list);
//联系人排序(选择法)
void SortContact(pcontact list);
//检查容量
int CheckSize(pcontact list);
//查找联系人在数组data第几个位置
int FindContactAddr(pcontact list);
//从文件中加载联系人到内存
void LoadContact(pcontact list);
//将联系人从内从中保存到文件
void SaveContact(pcontact list);
#endif
contact.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "contact.h"
//初始化通讯录
void InitContact(pcontact list)
{
list->data = (info *)malloc(sizeof(info)* MEMBER_MAX);
list->size = 0;
list->capacity = MEMBER_MAX;
//每次初始化是加载一遍文件,防止最新录入的在保存在文件时覆盖上次
//打开程序时保存的信息
LoadContact(list);
}
//添加联系人
void AddContact(pcontact list)
{
info tmp_member;
if (CheckCapacity(list) == 0)
{
printf("成员已满,添加失败!");
return;
}
printf("请输入姓名:");
scanf("%s", tmp_member.name);
printf("请输入性别:");
scanf("%s", tmp_member.sex);
printf("请输入年龄:");
scanf("%d", &tmp_member.age);
printf("请输入电话:");
scanf("%s", tmp_member.tele);
printf("请输入地址:");
scanf("%s", tmp_member.addr);
list->data[list->size] = tmp_member;
printf("添加成功!\n");
list->size++;
}
//删除联系人
void DellContact(pcontact list)
{
char tmp_name[NAME_MAX] = { 0 };
int ret = 0;
printf("请输入姓名:");
scanf("%s", tmp_name);
ret = FindContactAddr(list, tmp_name);
if (ret == -1)
{
printf("无此联系人!\n");
return;
}
for (ret; ret < list->size - 1; ret++)
{
list->data[ret] = list->data[ret + 1];
}
printf("删除成功!\n");
list->size--;
}
//查找联系人
void FindContact(pcontact list)
{
char tmp_name[NAME_MAX] = { 0 };
printf("请输入姓名:");
scanf("%s", tmp_name);
for (int i = 0; i < list->size; i++)
{
if (strcmp(tmp_name, list->data[i].name) == 0)
{
printf("===============================\n");
printf("姓名:%s\n", list->data[i].name);
printf("性别:%s\n", list->data[i].sex);
printf("年龄:%d\n", list->data[i].age);
printf("电话:%s\n", list->data[i].tele);
printf("地址:%s\n", list->data[i].addr);
printf("===============================\n");
return;
}
}
printf("无此联系人!\n");
}
//查找联系人在数组data第几个位置
int FindContactAddr(pcontact list, char *tmp_name)
{
for (int i = 0; i < list->size; i++)
{
if (strcmp(tmp_name, list->data[i].name) == 0)
return i;
}
return -1;
}
//修改联系人
void ModContact(pcontact list)
{
info tmp_member;
int ret = 0;
printf("请输入姓名:");
scanf("%s", tmp_member.name);
ret = FindContactAddr(list, tmp_member.name);
if (ret == -1)
{
printf("无此联系人!\n");
return;
}
printf("请输入性别:");
scanf("%s", tmp_member.sex);
printf("请输入年龄:");
scanf("%s", &tmp_member.age);
printf("请输入电话:");
scanf("%s", tmp_member.tele);
printf("请输入地址:");
scanf("%s", tmp_member.addr);
list->data[ret] = tmp_member;
printf("修改成功!\n");
}
//联系人排序(选择法)
void SortContact(pcontact list)
{
info tmp_member;
for (int i = 0; i < list->size - 2; i++)
{
for (int j = 1; j < list->size - 1; j++)
{
if (strcmp(list->data[i].name, list->data[j].name) > 0)
{
tmp_member = list->data[i];
list->data[i] = list->data[j];
list->data[j] = tmp_member;
}
}
}
}
//检查上次动态开辟的空间是否够用,不够时继续开辟
int CheckCapacity(pcontact list)
{
if (list->size == list->capacity)
{
info *tmp = (info *)malloc(sizeof(info)* (list->capacity + 10));
if (tmp == NULL)
return 0;
memcpy(tmp, list->data, sizeof(info) * list->size);
free(list->data);
list->data = tmp;
list->capacity += 10;
}
return 1;
}
//显示所有联系人
void ShowContact(pcontact list)
{
for (int i = 0; i < list->size; i++)
{
printf("============第%d位==============\n", i + 1);
printf("姓名:%s\n", list->data[i].name);
printf("性别:%s\n", list->data[i].sex);
printf("年龄:%d\n", list->data[i].age);
printf("电话:%s\n", list->data[i].tele);
printf("地址:%s\n", list->data[i].addr);
printf("===============================\n");
}
}
//从文件中加载联系人到内存
void LoadContact(pcontact list)
{
info tmp_member;
FILE *pf = NULL;
pf = fopen("./contatc.dat", "rb");
if (pf == NULL)
perror("fopen error");
//按照内存块读取,一次读1块,1块大小是sizeof(info)
while (fread(&tmp_member, sizeof(info), 1, pf))
{
if (CheckCapacity(list))
{
list->data[list->size] = tmp_member;
list->size++;
}
}
if (pf != NULL)
{
fclose(pf);
pf = NULL;
printf("加载成功!\n");
}
}
//将联系人从内从中保存到文件
void SaveContact(pcontact list)
{
FILE *pf = NULL;
pf = fopen("./contatc.dat", "wb");
if (pf == NULL)
perror("fopen error");
for (int i = 0; i < list->size; i++)
{
//按照内存块写入,一次写1块,1块大小是sizeof(info)
fwrite(list->data + i, sizeof(info), 1, pf);
}
if (pf != NULL)
{
fclose(pf);
pf = NULL;
printf("保存成功!\n");
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include "contact.h"
enum opt
{
Exit,
Add,
Dell,
Find,
Mod,
Show,
Load,
Save,
Sort,
};
void menu(void)
{
printf("/*========================通讯录======================*/\n");
printf("/*= 0.退出通讯录 1.添加联系人 =*/\n");
printf("/*= 2.删除联系人 3.查找联系人 =*/\n");
printf("/*= 4.修改联系人 5.显示所有联系人 =*/\n");
printf("/*= 6.加载联系人 7.保存联系人 =*/\n");
printf("/*= 8.联系人排序 =*/\n");
printf("/*====================================================*/\n");
}
void TestContact(void)
{
contact pc;
InitContact(&pc);
int opt = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &opt);
switch (opt)
{
case Exit:
printf("退出系统...\n");
break;
case Add:
AddContact(&pc);
break;
case Dell:
DellContact(&pc);
break;
case Find:
FindContact(&pc);
break;
case Mod:
ModContact(&pc);
break;
case Show:
ShowContact(&pc);
break;
case Load:
LoadContact(&pc);
break;
case Save:
SaveContact(&pc);
break;
case Sort:
SortContact(&pc);
break;
default:
printf("输入选项有误,重新输入!\n");
break;
}
} while (opt);
}
int main(void)
{
TestContact();
printf("\n");
system("pause");
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计2243个文字,预计阅读时间需要9分钟。
本文以实例形式分享了C语言实现简易通讯录的代码,供大家参考。主要包括以下内容:
一、概述简易通讯录是一种基本的数据存储工具,用于存储和查询联系人信息。本文将介绍如何使用C语言实现一个简易的通讯录程序。
二、通讯录的实现通讯录的实现主要包括以下几个方面:
1. 指针:用于动态分配内存,存储联系人信息。
2.结构体:定义联系人信息的数据结构。
3.动态内存管理:包括内存的分配、释放等操作。
4.文件的读写操作:将通讯录信息保存到文件,并从文件中读取。
三、代码示例
以下是一个简易通讯录的代码示例:c#include #include
// 定义联系人信息结构体typedef struct { char name[50]; char phone[20];} Contact;
// 函数声明void addContact(Contact **contacts, int *size);void deleteContact(Contact **contacts, int *size);void listContacts(Contact *contacts, int size);void saveContacts(Contact *contacts, int size);void loadContacts(Contact **contacts, int *size);
int main() { Contact *contacts=NULL; int size=0;
// 加载通讯录信息 loadContacts(&contacts, &size);
// 用户交互 int choice; do { printf(1. 添加联系人\n); printf(2. 删除联系人\n); printf(3. 查看联系人\n); printf(4. 保存通讯录\n); printf(5. 退出\n); printf(请输入操作选项:); scanf(%d, &choice);
switch (choice) { case 1: addContact(&contacts, &size); break; case 2: deleteContact(&contacts, &size); break; case 3: listContacts(contacts, size); break; case 4: saveContacts(contacts, size); break; case 5: printf(退出程序。\n); break; default: printf(无效选项,请重新输入。\n); } } while (choice !=5);
// 释放内存 free(contacts); return 0;}
// 添加联系人void addContact(Contact **contacts, int *size) { Contact *new_contacts=realloc(contacts, (*size + 1) * sizeof(Contact)); if (new_contacts==NULL) { printf(内存分配失败。\n); return; } contacts=new_contacts;
printf(请输入联系人姓名:); scanf(%s, contacts[*size].name); printf(请输入联系人电话:); scanf(%s, contacts[*size].phone); (*size)++;}
// 删除联系人void deleteContact(Contact **contacts, int *size) { int index; printf(请输入要删除的联系人序号:); scanf(%d, &index); if (index =*size) { printf(无效的联系人序号。\n); return; }
Contact *new_contacts=realloc(contacts, (*size - 1) * sizeof(Contact)); if (new_contacts==NULL) { printf(内存分配失败。\n); return; } for (int i=index; i < *size - 1; i++) { new_contacts[i]=contacts[i + 1]; } free(contacts); contacts=new_contacts; (*size)--;}
// 查看联系人void listContacts(Contact *contacts, int size) { for (int i=0; i // 保存通讯录void saveContacts(Contact *contacts, int size) { FILE *file=fopen(contacts.txt, w); if (file==NULL) { printf(文件打开失败。\n); return; } for (int i=0; i // 加载通讯录void loadContacts(Contact **contacts, int *size) { FILE *file=fopen(contacts.txt, r); if (file==NULL) { printf(文件打开失败。\n); return; } char name[50], phone[20]; while (fscanf(file, %s,%s\n, name, phone) !=EOF) { Contact *new_contacts=realloc(contacts, (*size + 1) * sizeof(Contact)); if (new_contacts==NULL) { printf(内存分配失败。\n); return; } contacts=new_contacts; strcpy(contacts[*size].name, name); strcpy(contacts[*size].phone, phone); (*size)++; } fclose(file);} 本文实例为大家分享了C语言实现简易通讯录的具体代码,供大家参考,具体内容如下 一、概述 通讯录的实现其中包括了指针、结构体、动态内存管理、文件的读写操作等知识点,是对这些知识点应用巩固的非常好的例子; 通讯录功能如下: 二、代码如下 contact.h
#ifndef CONTACT_H
#define CONTACT_H
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 20
#define MEMBER_MAX 1
typedef struct info
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TEL_MAX];
char addr[ADDR_MAX];
}info;
typedef struct contact
{
info *data;
int size;
int capacity;
}contact, *pcontact;
//初始化通讯录
void InitContact(pcontact list);
//添加联系人
void AddContact(pcontact list);
//删除联系人
void DellContact(pcontact list);
//查找联系人
void FindContact(pcontact list);
//修改联系人
void ModContact(pcontact list);
//显示所有联系人
void ShowContact(pcontact list);
//联系人排序(选择法)
void SortContact(pcontact list);
//检查容量
int CheckSize(pcontact list);
//查找联系人在数组data第几个位置
int FindContactAddr(pcontact list);
//从文件中加载联系人到内存
void LoadContact(pcontact list);
//将联系人从内从中保存到文件
void SaveContact(pcontact list);
#endif
contact.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "contact.h"
//初始化通讯录
void InitContact(pcontact list)
{
list->data = (info *)malloc(sizeof(info)* MEMBER_MAX);
list->size = 0;
list->capacity = MEMBER_MAX;
//每次初始化是加载一遍文件,防止最新录入的在保存在文件时覆盖上次
//打开程序时保存的信息
LoadContact(list);
}
//添加联系人
void AddContact(pcontact list)
{
info tmp_member;
if (CheckCapacity(list) == 0)
{
printf("成员已满,添加失败!");
return;
}
printf("请输入姓名:");
scanf("%s", tmp_member.name);
printf("请输入性别:");
scanf("%s", tmp_member.sex);
printf("请输入年龄:");
scanf("%d", &tmp_member.age);
printf("请输入电话:");
scanf("%s", tmp_member.tele);
printf("请输入地址:");
scanf("%s", tmp_member.addr);
list->data[list->size] = tmp_member;
printf("添加成功!\n");
list->size++;
}
//删除联系人
void DellContact(pcontact list)
{
char tmp_name[NAME_MAX] = { 0 };
int ret = 0;
printf("请输入姓名:");
scanf("%s", tmp_name);
ret = FindContactAddr(list, tmp_name);
if (ret == -1)
{
printf("无此联系人!\n");
return;
}
for (ret; ret < list->size - 1; ret++)
{
list->data[ret] = list->data[ret + 1];
}
printf("删除成功!\n");
list->size--;
}
//查找联系人
void FindContact(pcontact list)
{
char tmp_name[NAME_MAX] = { 0 };
printf("请输入姓名:");
scanf("%s", tmp_name);
for (int i = 0; i < list->size; i++)
{
if (strcmp(tmp_name, list->data[i].name) == 0)
{
printf("===============================\n");
printf("姓名:%s\n", list->data[i].name);
printf("性别:%s\n", list->data[i].sex);
printf("年龄:%d\n", list->data[i].age);
printf("电话:%s\n", list->data[i].tele);
printf("地址:%s\n", list->data[i].addr);
printf("===============================\n");
return;
}
}
printf("无此联系人!\n");
}
//查找联系人在数组data第几个位置
int FindContactAddr(pcontact list, char *tmp_name)
{
for (int i = 0; i < list->size; i++)
{
if (strcmp(tmp_name, list->data[i].name) == 0)
return i;
}
return -1;
}
//修改联系人
void ModContact(pcontact list)
{
info tmp_member;
int ret = 0;
printf("请输入姓名:");
scanf("%s", tmp_member.name);
ret = FindContactAddr(list, tmp_member.name);
if (ret == -1)
{
printf("无此联系人!\n");
return;
}
printf("请输入性别:");
scanf("%s", tmp_member.sex);
printf("请输入年龄:");
scanf("%s", &tmp_member.age);
printf("请输入电话:");
scanf("%s", tmp_member.tele);
printf("请输入地址:");
scanf("%s", tmp_member.addr);
list->data[ret] = tmp_member;
printf("修改成功!\n");
}
//联系人排序(选择法)
void SortContact(pcontact list)
{
info tmp_member;
for (int i = 0; i < list->size - 2; i++)
{
for (int j = 1; j < list->size - 1; j++)
{
if (strcmp(list->data[i].name, list->data[j].name) > 0)
{
tmp_member = list->data[i];
list->data[i] = list->data[j];
list->data[j] = tmp_member;
}
}
}
}
//检查上次动态开辟的空间是否够用,不够时继续开辟
int CheckCapacity(pcontact list)
{
if (list->size == list->capacity)
{
info *tmp = (info *)malloc(sizeof(info)* (list->capacity + 10));
if (tmp == NULL)
return 0;
memcpy(tmp, list->data, sizeof(info) * list->size);
free(list->data);
list->data = tmp;
list->capacity += 10;
}
return 1;
}
//显示所有联系人
void ShowContact(pcontact list)
{
for (int i = 0; i < list->size; i++)
{
printf("============第%d位==============\n", i + 1);
printf("姓名:%s\n", list->data[i].name);
printf("性别:%s\n", list->data[i].sex);
printf("年龄:%d\n", list->data[i].age);
printf("电话:%s\n", list->data[i].tele);
printf("地址:%s\n", list->data[i].addr);
printf("===============================\n");
}
}
//从文件中加载联系人到内存
void LoadContact(pcontact list)
{
info tmp_member;
FILE *pf = NULL;
pf = fopen("./contatc.dat", "rb");
if (pf == NULL)
perror("fopen error");
//按照内存块读取,一次读1块,1块大小是sizeof(info)
while (fread(&tmp_member, sizeof(info), 1, pf))
{
if (CheckCapacity(list))
{
list->data[list->size] = tmp_member;
list->size++;
}
}
if (pf != NULL)
{
fclose(pf);
pf = NULL;
printf("加载成功!\n");
}
}
//将联系人从内从中保存到文件
void SaveContact(pcontact list)
{
FILE *pf = NULL;
pf = fopen("./contatc.dat", "wb");
if (pf == NULL)
perror("fopen error");
for (int i = 0; i < list->size; i++)
{
//按照内存块写入,一次写1块,1块大小是sizeof(info)
fwrite(list->data + i, sizeof(info), 1, pf);
}
if (pf != NULL)
{
fclose(pf);
pf = NULL;
printf("保存成功!\n");
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include "contact.h"
enum opt
{
Exit,
Add,
Dell,
Find,
Mod,
Show,
Load,
Save,
Sort,
};
void menu(void)
{
printf("/*========================通讯录======================*/\n");
printf("/*= 0.退出通讯录 1.添加联系人 =*/\n");
printf("/*= 2.删除联系人 3.查找联系人 =*/\n");
printf("/*= 4.修改联系人 5.显示所有联系人 =*/\n");
printf("/*= 6.加载联系人 7.保存联系人 =*/\n");
printf("/*= 8.联系人排序 =*/\n");
printf("/*====================================================*/\n");
}
void TestContact(void)
{
contact pc;
InitContact(&pc);
int opt = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &opt);
switch (opt)
{
case Exit:
printf("退出系统...\n");
break;
case Add:
AddContact(&pc);
break;
case Dell:
DellContact(&pc);
break;
case Find:
FindContact(&pc);
break;
case Mod:
ModContact(&pc);
break;
case Show:
ShowContact(&pc);
break;
case Load:
LoadContact(&pc);
break;
case Save:
SaveContact(&pc);
break;
case Sort:
SortContact(&pc);
break;
default:
printf("输入选项有误,重新输入!\n");
break;
}
} while (opt);
}
int main(void)
{
TestContact();
printf("\n");
system("pause");
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

