用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);
}