C语言示例讲解动态文件静态功能版本的通讯录实现
更新时间:2023-08-09前言
通讯录是一个常见的应用程序,用于存储个人或组织的联系信息。在这个示例中,我们将使用C语言来实现一个通讯录,包括动态、文件和静态功能版本。动态版本使用内存动态分配来存储通讯录条目,文件版本将联系信息保存到文件中,静态版本使用静态数组来存储数据。
动态版本
在动态版本中,我们使用malloc()函数动态分配内存来存储通讯录。每个通讯录条目都是一个结构体,其中包含姓名、电话号码和电子邮件地址等信息。我们可以使用指针数组来保存每个通讯录条目的地址,并使用循环来遍历和操作通讯录。例如,我们可以实现添加、删除和修改条目的功能。
#include#include #include #define MAX_ENTRIES 100 typedef struct { char name[50]; char phone[20]; char email[50]; } Contact; int main() { Contact* contacts[MAX_ENTRIES]; int num_entries = 0; // 添加条目 contacts[num_entries] = (Contact*)malloc(sizeof(Contact)); strcpy(contacts[num_entries]->name, "张三"); strcpy(contacts[num_entries]->phone, "1234567890"); strcpy(contacts[num_entries]->email, "zhangsan@example.com"); num_entries++; // 修改条目 strcpy(contacts[0]->phone, "9876543210"); // 删除条目 free(contacts[0]); for (int i = 0; i < num_entries-1; i++) { contacts[i] = contacts[i+1]; } num_entries--; return 0; }
文件版本
在文件版本中,我们使用文件来保存通讯录的数据。我们可以使用文件读写操作来实现添加、删除和修改通讯录条目。为了保持数据的一致性,我们可以定义一种文件格式,将每个条目以特定的格式存储在文件中。
#include#include typedef struct { char name[50]; char phone[20]; char email[50]; } Contact; void addContactToFile(Contact* contact) { FILE* file = fopen("contacts.txt", "a"); fwrite(contact, sizeof(Contact), 1, file); fclose(file); } void deleteContactFromFile(const char* name) { FILE* file = fopen("contacts.txt", "r+"); Contact contact; while (fread(&contact, sizeof(Contact), 1, file)) { if (strcmp(contact.name, name) == 0) { fseek(file, -sizeof(Contact), SEEK_CUR); fwrite(&contact, sizeof(Contact), 1, file); } } fclose(file); } void updateContactInFile(const char* name, Contact* newContact) { FILE* file = fopen("contacts.txt", "r+"); Contact contact; while (fread(&contact, sizeof(Contact), 1, file)) { if (strcmp(contact.name, name) == 0) { fseek(file, -sizeof(Contact), SEEK_CUR); fwrite(newContact, sizeof(Contact), 1, file); } } fclose(file); } int main() { // 添加条目到文件中 Contact contact; strcpy(contact.name, "李四"); strcpy(contact.phone, "0987654321"); strcpy(contact.email, "lisi@example.com"); addContactToFile(&contact); // 从文件中删除条目 deleteContactFromFile("张三"); // 在文件中更新条目 Contact newContact; strcpy(newContact.name, "王五"); strcpy(newContact.phone, "5678901234"); strcpy(newContact.email, "wangwu@example.com"); updateContactInFile("李四", &newContact); return 0; }
静态版本
在静态版本中,我们使用静态数组来存储通讯录的数据。这意味着通讯录的大小是固定的,无法超出预先定义的数组大小。我们可以使用循环遍历和操作静态数组来实现添加、删除和修改通讯录条目的功能。
#include#include #define MAX_ENTRIES 100 typedef struct { char name[50]; char phone[20]; char email[50]; } Contact; void addContact(Contact* contacts, const Contact* newContact, int* num_entries) { if (*num_entries < MAX_ENTRIES) { contacts[*num_entries] = *newContact; (*num_entries)++; } } void deleteContact(Contact* contacts, const char* name, int* num_entries) { for (int i = 0; i < *num_entries; i++) { if (strcmp(contacts[i].name, name) == 0) { for (int j = i; j < *num_entries-1; j++) { contacts[j] = contacts[j+1]; } (*num_entries)--; } } } void updateContact(Contact* contacts, const char* name, const Contact* newContact, int num_entries) { for (int i = 0; i < num_entries; i++) { if (strcmp(contacts[i].name, name) == 0) { contacts[i] = *newContact; } } } int main() { Contact contacts[MAX_ENTRIES]; int num_entries = 0; // 添加条目 Contact newContact = {"赵六", "5678912345", "zhaoliu@example.com"}; addContact(contacts, &newContact, &num_entries); // 删除条目 deleteContact(contacts, "李四", &num_entries); // 修改条目 Contact updatedContact = {"王五", "9876543210", "wangwu@example.com"}; updateContact(contacts, "赵六", &updatedContact, num_entries); return 0; }
总结
通过使用C语言,我们实现了动态、文件和静态版本的通讯录。动态版本使用内存动态分配来存储数据,文件版本将数据保存到文件中,而静态版本使用静态数组来存储数据。每个版本都有自己的优势和限制,根据具体需求选择合适的版本。这个示例提供了一个基本的框架,你可以根据自己的需求进行修改和扩展。