c语言编程笔录

首页 > C语言 > c语言

c语言

C语言实现可保存的动态通讯录的示例代码

更新时间:2023-08-09

前言

可保存的动态通讯录是一种能够实现联系人信息的增删改查,并能将联系人信息保存在某种持久化存储介质中的系统。在这个示例中,我们将使用C语言来实现一个简单的可保存的动态通讯录。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CONTACTS 100

// 联系人结构体
typedef struct {
    char name[50];
    char phone[20];
    char email[50];
} Contact;

// 通讯录结构体
typedef struct {
    int count;
    Contact contacts[MAX_CONTACTS];
} AddressBook;

// 初始化通讯录
void initialize(AddressBook* addressBook) {
    addressBook->count = 0;
}

// 添加联系人
void addContact(AddressBook* addressBook, const char* name, const char* phone, const char* email) {
    if (addressBook->count < MAX_CONTACTS) {
        Contact *newContact = &addressBook->contacts[addressBook->count];
        strncpy(newContact->name, name, 50);
        strncpy(newContact->phone, phone, 20);
        strncpy(newContact->email, email, 50);
        addressBook->count++;
    }
}

// 删除联系人
void deleteContact(AddressBook* addressBook, const char* name) {
    for (int i = 0; i < addressBook->count; i++) {
        if (strcmp(addressBook->contacts[i].name, name) == 0) {
            for (int j = i; j < addressBook->count - 1; j++) {
                addressBook->contacts[j] = addressBook->contacts[j + 1];
            }
            addressBook->count--;
            break;
        }
    }
}

// 更新联系人信息
void updateContact(AddressBook* addressBook, const char* name, const char* phone, const char* email) {
    for (int i = 0; i < addressBook->count; i++) {
        if (strcmp(addressBook->contacts[i].name, name) == 0) {
            strncpy(addressBook->contacts[i].phone, phone, 20);
            strncpy(addressBook->contacts[i].email, email, 50);
            break;
        }
    }
}

// 查找联系人
Contact* findContact(AddressBook* addressBook, const char* name) {
    for (int i = 0; i < addressBook->count; i++) {
        if (strcmp(addressBook->contacts[i].name, name) == 0) {
            return &addressBook->contacts[i];
        }
    }
    return NULL;
}

// 保存通讯录到文件
void saveToFile(const char* filename, AddressBook* addressBook) {
    FILE* file = fopen(filename, "wb");
    if (file != NULL) {
        fwrite(addressBook, sizeof(AddressBook), 1, file);
        fclose(file);
    }
}

// 从文件中加载通讯录
void loadFromFile(const char* filename, AddressBook* addressBook) {
    FILE* file = fopen(filename, "rb");
    if (file != NULL) {
        fread(addressBook, sizeof(AddressBook), 1, file);
        fclose(file);
    }
}

int main() {
    AddressBook addressBook;
    initialize(&addressBook);
    addContact(&addressBook, "张三", "123456789", "zhangsan@example.com");
    addContact(&addressBook, "李四", "987654321", "lisi@example.com");
    
    Contact* contact = findContact(&addressBook, "张三");
    if (contact != NULL) {
        printf("姓名:%s\n", contact->name);
        printf("电话:%s\n", contact->phone);
        printf("邮箱:%s\n", contact->email);
    }
    
    saveToFile("addressbook.dat", &addressBook);
    
    AddressBook loadedAddressBook;
    loadFromFile("addressbook.dat", &loadedAddressBook);
    
    contact = findContact(&loadedAddressBook, "李四");
    if (contact != NULL) {
        printf("姓名:%s\n", contact->name);
        printf("电话:%s\n", contact->phone);
        printf("邮箱:%s\n", contact->email);
    }
    
    return 0;
}

代码解析

首先,我们定义了两个结构体:Contact和AddressBook。Contact表示一个联系人的信息,包括姓名、电话和邮箱。AddressBook表示一个完整的通讯录,包括通讯录中联系人的数量和一个联系人结构体数组。

接下来,我们实现了几个通讯录操作的函数。initialize函数用于初始化一个通讯录;addContact函数用于添加联系人到通讯录;deleteContact函数用于从通讯录中删除联系人;updateContact函数用于更新联系人的电话和邮箱信息;findContact函数用于根据姓名查找联系人。

在main函数中,我们演示了如何使用上述函数来操作通讯录。首先初始化一个通讯录,然后添加两个联系人。接着,通过findContact函数查找联系人,并输出其信息。最后,我们调用saveToFile函数将通讯录保存到文件,再通过loadFromFile函数从文件中加载通讯录,并再次通过findContact函数查找联系人。

这个示例展示了如何使用C语言实现一个简单的可保存的动态通讯录。你可以根据实际需求进一步扩展功能,例如添加更多字段,实现数据的排序和搜索等。

总结

在这个示例中,我们用C语言实现了一个可保存的动态通讯录。通过定义结构体和实现相关函数,我们能够实现通讯录的增删改查功能,并将通讯录保存到文件中。这个示例可以作为一个基础的框架,供你在实际项目中进行扩展和优化。