用c语言在完成小型通讯录

用c语言在完成小型通讯录

小项目:通讯录系统

在这里插入图片描述

​ 要求:存储联系人信息:
​ 姓名、性别、电话
​ 最大存储量50人
​ 功能要求:
​ 1、增加联系人
​ 2、按名字删除联系人
​ 3、按名字修改联系人信息
​ 4、查找联系人,按照电话或者姓名,支持模糊查找
​ 5、显示所有联系人信息
​ 6、退出系统

这个通讯录我是存放在文件里的,即使关闭程序,下次打开上次存放的信息还在里面

废话不多说,直接上代码

main.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "contact.h"
#include "utils.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX_INPUT_LENGTH 100

main.c

这个里面放的是主页面的菜单代码

#include "main.h"

int main() {
    Contact contacts[MAX_CONTACTS];
    initialize_contacts(contacts);

    int num_contacts = load_contacts(contacts, &num_contacts);

     //从文件加载联系人信息到数组中
   load_contacts(contacts, &num_contacts);

    int choice;
    char input[MAX_INPUT_LENGTH];

    do {
        printf("\n===== Contact Management System =====\n");
        printf("1. 新增联系人\n");
        printf("2. 删除联系人\n");
        printf("3. 修改联系人\n");
        printf("4. 搜索联系人\n");
        printf("5. 显示所有联系人\n");
        printf("6. Exit\n");
        printf("请输入你的选择: ");
        scanf("%d", &choice);

       switch (choice) {
    case 1: // 增加联系人
    {
           system("clear");
           load_contacts(contacts, &num_contacts); // 从文件加载联系人信息到数组中
        Contact new_contact;
        printf("请输入姓名:");
        scanf("%s", new_contact.name);
        printf("请输入性别(男/女):");
        scanf(" %s", &new_contact.gender); 
        printf("请输入电话号码:");
        scanf("%s", new_contact.phone);
        if (is_valid_name(new_contact.name) && is_valid_phone(new_contact.phone)) {
            if (add_contact(contacts, &num_contacts, &new_contact)) {
                save_contacts(contacts, num_contacts);
                printf("联系人添加成功。\n");
            }
            else {
                printf("联系人添加失败。\n");
            }
        }
        else {
            printf("输入的姓名或电话号码无效。\n");
        }
        break;
    }
    case 2: // 删除联系人
    {
        system("clear");
        load_contacts(contacts, &num_contacts); // 从文件加载联系人信息到数组中
        char name_to_delete[MAX_NAME_LENGTH];
        printf("请输入要删除的联系人姓名:");
        scanf("%s", name_to_delete);
        if (delete_contact(contacts, &num_contacts, name_to_delete)) {
            save_contacts(contacts, num_contacts);
            printf("联系人删除成功。\n");
        }
        break;
    }
    case 3: // 修改联系人
    {
        system("clear");
        char name_to_modify[MAX_NAME_LENGTH];
        load_contacts(contacts, &num_contacts); // 从文件加载联系人信息到数组中
        Contact new_info;
        printf("请输入要修改的联系人姓名:");
        scanf("%s", &name_to_modify);
        printf("请输入新的姓名:");
        scanf("%s", &new_info.name);
        printf("请输入新的性别(男/女):");
        scanf(" %s", &new_info.gender);
        printf("请输入新的电话号码:");
        scanf("%s", &new_info.phone);
        if (is_valid_name(new_info.name) && is_valid_phone(new_info.phone)) {
            if (modify_contact(contacts, num_contacts, name_to_modify, &new_info)) {
                save_contacts(contacts, num_contacts);
                printf("联系人信息修改成功。\n");
            }
        }
        else {
            printf("输入的姓名或电话号码无效。\n");
        }
        break;
    }
    case 4: // 搜索联系人
    {
        system("clear");
        load_contacts(contacts, &num_contacts); // 从文件加载联系人信息到数组中
        char query[MAX_INPUT_LENGTH];
        printf("请输入查询关键词:");
        scanf("%s", query);
        search_contact(contacts, num_contacts, query);
        break;
    }
    case 5: // 显示所有联系人
        system("clear");
        load_contacts(contacts, &num_contacts); // 从文件加载联系人信息到数组中
        
        display_contacts(contacts, num_contacts);
        break;
    case 6: // 退出程序
        printf("退出程序...\n");
        exit(0);
        break;
    default:
        printf("输入错误,请重新输入!\n");
}
    } while (choice != 6);

    return 0;
}

contact.h
#ifndef CONTACT_H
#define CONTACT_H

#define MAX_CONTACTS 50
#define MAX_NAME_LENGTH 50
#define MAX_PHONE_LENGTH 20

typedef struct {
    char name[MAX_NAME_LENGTH];
    char gender[10];
    char phone[MAX_PHONE_LENGTH];
} Contact;

void initialize_contacts(Contact contacts[]);
int add_contact(Contact contacts[], int* num_contacts, const Contact* new_contact);
int delete_contact(Contact contacts[], int* num_contacts, const char* name);
int modify_contact(Contact contacts[], int num_contacts, const char* name, const Contact* new_contact);
void search_contact(Contact contacts[], int num_contacts, const char* query);
void display_contacts(Contact contacts[], int num_contacts);



int load_contacts(Contact contacts[], int* num_contacts);
void save_contacts(Contact contacts[], int num_contacts);
#endif /* CONTACT_H */

contact.c

这个里面写的都是一些增删改查函数

#include"main.h"
void initialize_contacts(Contact contacts[]) {
    for (int i = 0; i < MAX_CONTACTS; ++i) {
        contacts[i].name[0] = '\0';
    }
}

int add_contact(Contact contacts[], int* num_contacts, const Contact* new_contact) {
    if (*num_contacts >= MAX_CONTACTS) {
        printf("无法添加新联系人,通讯录已满。\n");
        return 0; // 返回0表示添加失败
    }

    contacts[*num_contacts] = *new_contact;
    (*num_contacts)++;

    save_contacts(contacts, *num_contacts); // 每次添加联系人后保存到文件

    printf("联系人 %s 已成功添加到通讯录。\n", new_contact->name);

    return 1; // 返回1表示添加成功
}

int delete_contact(Contact contacts[], int* num_contacts, const char* name) {
    int found = 0;
    FILE* fp = fopen("contacts.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件 contacts.txt");
        return 0;
    }
    for (int i = 0; i < *num_contacts; ++i) {
        if (strcmp(contacts[i].name, name) == 0) {
            found = 1;
        }
        else {
            fprintf(fp, "%s %s %s\n", contacts[i].name, contacts[i].gender, contacts[i].phone);
        }
    }
    fclose(fp);

    if (found) {
        (*num_contacts)--;
        printf("联系人 %s 已成功删除。\n", name);
        return 1;
    }
    else {
        printf("未找到名为 %s 的联系人。\n", name);
        return 0;
    }
}

int modify_contact(Contact contacts[], int num_contacts, const char* name, const Contact* new_contact) {
    int found = 0;

    for (int i = 0; i < num_contacts; ++i) {
        if (strcmp(contacts[i].name, name) == 0) {
            contacts[i] = *new_contact;
            found = 1;
            printf("联系人 %s 的信息已成功修改。\n", name);
            break;
        }
    }

    if (!found) {
        printf("未找到名为 %s 的联系人。\n", name);
    }
    else {
        save_contacts(contacts, num_contacts); // 每次修改联系人后保存到文件
    }

    return found;
}

void display_contacts(Contact contacts[], int num_contacts) {

    printf("所有联系人信息:\n");
    for (int i = 0; i < num_contacts; i++) {
        printf("姓名:%s 性别:%s 电话:%s\n", contacts[i].name, contacts[i].gender, contacts[i].phone);
    }
}

void search_contact(Contact contacts[], int num_contacts, const char* query) {
    int found = 0;
    num_contacts = 3;
    printf("搜索结果:\n");
    printf("%-6s %-10s %-10s \n", "姓名", "性别", "电话");
    for (int i = 0; i < num_contacts; i++) {
        if (strstr(contacts[i].name, query) != NULL || strstr(contacts[i].phone, query) != NULL) {
            printf("%-6s %-10s %-10s \n", contacts[i].name, contacts[i].gender, contacts[i].phone);
            found = 1;
        }
    }
    if (!found) {
        printf("未找到与查询 '%s' 相关的联系人。\n", query);
    }
}


//从文件加载联系人信息
int load_contacts(Contact contacts[], int* num_contacts)
{
    FILE* fp = fopen("contacts.txt", "r");
    if (fp == NULL)
    {
        perror("无法打开文件 contacts.txt");
        return 0;
    }
    *num_contacts = 0;
    char line[50];
    while (fgets(line, sizeof(line), fp) != NULL)
    {
        if (sscanf(line, "%s %s %s\n", contacts[*num_contacts].name, contacts[*num_contacts].gender, contacts[*num_contacts].phone)!=  EOF)
        {
            (*num_contacts)++;
        }
    }
    fclose(fp);
    return *num_contacts;
}
//将联系人信息保存到文件
void save_contacts(Contact contacts[], int num_contacts) 
{
    FILE* fp = fopen("contacts.txt", "w");
    if (fp == NULL) {
        perror("无法打开文件 contacts.txt");
        return;
    }

    for (int i = 0; i < num_contacts; ++i) {
        fprintf(fp, "%s %s %s\n", contacts[i].name, contacts[i].gender, contacts[i].phone);
    }

    fclose(fp);
}

utils.h
#ifndef UTILS_H
#define UTILS_H

int is_valid_name(const char *name);
int is_valid_phone(const char *phone);
int string_starts_with(const char *str, const char *prefix);
// 从文件加载联系人数量
void load_num_contacts(int* num_contacts);
#endif /* UTILS_H */

utils.c

这个都是一些频繁用到的工具,用来检查的,以及对文件的加载我也写在里面

#include "main.h"

int is_valid_name(const char* name) {
    // 判断名字是否为空指针或者空字符串
    if (name == NULL || strlen(name) == 0) {
        return 0; // 名字无效
    }

    // 进一步可以添加长度限制等其他条件判断

    return 1; // 名字有效
}

int is_valid_phone(const char* phone) {
    // 判断电话号码是否为空指针或者空字符串
    if (phone == NULL || strlen(phone) == 0) {
        return 0; // 电话号码无效
    }

    // 判断电话号码是否全是数字
    for (int i = 0; phone[i] != '\0'; i++) {
        if (!isdigit(phone[i])) {
            return 0; // 包含非数字字符,电话号码无效
        }
    }

    return 1; // 电话号码有效
}

int string_starts_with(const char* str, const char* prefix) {
    // 判断空指针情况
    if (str == NULL || prefix == NULL) {
        return 0; // 不处理空指针
    }

    size_t len_str = strlen(str);
    size_t len_prefix = strlen(prefix);

    // 如果str比prefix短,肯定不是以prefix开头
    if (len_str < len_prefix) {
        return 0;
    }

    // 比较前缀部分是否相同
    return strncmp(str, prefix, len_prefix) == 0;
}

// 从文件加载联系人数量
void load_num_contacts(int* num_contacts) {
    FILE* fp = fopen("num_contacts.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件 num_contacts.txt");
        return;
    }

    fscanf(fp, "%d", num_contacts);

    fclose(fp);
}
  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值