C語(yǔ)言實(shí)現(xiàn)通訊錄
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)通訊錄的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)的功能有:
1.初始化通訊錄;
2. 通訊錄中增加條目;
3. 刪除通訊錄中的指定條目;
4. 按指定規(guī)則查找通訊錄中特定條目;
5. 打印通訊錄中的所有信息;
6. 修改通訊錄的指定條目;
7. 銷毀通訊錄;
8. 將通訊錄內(nèi)容保存在文件;
9. 將文件中的內(nèi)容加載回內(nèi)存。
**Addr_Book.h**
#pragma once
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME_SIZE 200
#define PHONE_SIZE 200
#define ADDR_SIZE 200
typedef struct PersonInfo {
char name[NAME_SIZE];
char phone[PHONE_SIZE];
char addr[ADDR_SIZE];
} PersonInfo;
#define FILE_PATH "./data.txt"
enum {
DISPLAY = 1,
ADD = 2,
ERASE = 3,
FIND = 4,
MODIFY = 5,
EXIT = 0
};
typedef struct AddrBook {
PersonInfo* data;//內(nèi)容
size_t size; //聯(lián)系人數(shù)量
size_t capacity; //通訊錄容量
} AddrBook;
/**
* @brief 初始化通訊錄
*
* @param addr_book
*/
void AddrBookInit(AddrBook* addr_book);
/**
* @brief 通訊錄中增加條目
*
* @param addr_book
*/
void AddrBookAdd(AddrBook* addr_book);
/**
* @brief 刪除通訊錄中的指定條目
*
* @param addr_book
*/
void AddrBookErase(AddrBook* addr_book);
/**
* @brief 按指定規(guī)則查找通訊錄中特定條目
*
* @param addr_book
*/
void AddrBookFind(AddrBook* addr_book);
/**
* @brief 打印通訊錄中的所有信息
*
* @param addr_book
*/
void AddrBookDisplay(AddrBook* addr_book);
/**
* @brief 修改通訊錄的指定條目
*
* @param addr_book
*/
void AddrBookModify(AddrBook* addr_book);
/**
* @brief 銷毀通訊錄
*
* @param addr_book
*/
void AddrBookDestroy(AddrBook* addr_book);
/**
* @brief 將通訊錄內(nèi)容保存在文件
*
* @param addr_book
*/
void AddrBookSave(AddrBook* addr_book);
/**
* @brief 將文件中的內(nèi)容加載回內(nèi)存.
*
* @param addr_book
*/
void AddrBookLoad(AddrBook* addr_book);
**Addr_Book.c**
#define _CRT_SECURE_NO_WARNINGS 1
#include "Addr_Book.h"
//打印通訊錄
void AddrBookDisplay(AddrBook* addr_book){
if (addr_book == NULL){
return;
}
printf("\n====================通訊錄=========================\n");
printf("| 姓名 | 號(hào)碼 | 地址 |\n");
printf("|----------------|---------------|----------------|\n");
size_t i = 0;
for (; i < addr_book->size; ++i){
printf("| %s | %s | %s |\n",
addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
printf("|----------------|---------------|----------------|\n");
}
}
//初始化通訊錄
void AddrBookInit(AddrBook* addr_book){
if (addr_book == NULL){
return ;
}
addr_book->size = 0;
addr_book->capacity = 1;
addr_book->data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);
}
//擴(kuò)大內(nèi)存
void AddrBookRelloc(AddrBook* addr_book){
if (addr_book == NULL){
return;
}
addr_book->capacity = addr_book->capacity * 2 + 1;//內(nèi)存不夠,擴(kuò)大容量
PersonInfo* new_data = (PersonInfo*)malloc(sizeof(PersonInfo)*addr_book->capacity);//開(kāi)辟新的空間大小
size_t i = 0;
for (; i < addr_book->size; ++i){
new_data[i] = addr_book->data[i];//將舊內(nèi)存賦給新內(nèi)存
}
free(addr_book->data);//釋放舊內(nèi)存
addr_book->data = new_data;
}
//添加聯(lián)系人
void AddrBookAdd(AddrBook* addr_book){
if (addr_book == NULL){
return;
}
if (addr_book->size >= addr_book->capacity){ //內(nèi)存不夠需要擴(kuò)大內(nèi)存
AddrBookRelloc(addr_book);
}
size_t cur = addr_book->size;
++addr_book->size;
printf("添加聯(lián)系人\n");
printf("輸入姓名:");
scanf("%s", addr_book->data[cur].name);
printf("輸入號(hào)碼:");
scanf("%s", addr_book->data[cur].phone);
printf("輸入地址:");
scanf("%s", addr_book->data[cur].addr);
printf("添加結(jié)束!\n");
}
//刪除指定聯(lián)系人
void AddrBookErase(AddrBook* addr_book){
if (addr_book == NULL){
return;
}
char delete_name[200] = {0};
printf("輸入要?jiǎng)h除聯(lián)系人姓名:");
scanf("%s", &delete_name);
size_t i = 0;
for (; i <addr_book->size;++i){
if (strcmp(addr_book->data[i].name, delete_name)){
free(addr_book->data);
addr_book->size--;
printf("已刪除!");
}
else{
printf("刪除失敗,請(qǐng)重新輸入聯(lián)系人!");
}
}
}
//保存內(nèi)容
void AddrBookSave(AddrBook* addr_book){
FILE* fp = fopen(FILE_PATH, "w");
if (fp == NULL){
printf("打開(kāi)文件失敗!\n");
return;
}
size_t i = 0;
for (; i < addr_book->size; ++i){
fprintf(fp, "| %s | %s | %s |\n",
addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
}
fclose(fp);
}
//按姓名查找聯(lián)系人
void AddrBookFind(AddrBook* addr_book){
if (addr_book == NULL){
return;
}
char delete_name[200] = { 0 };
printf("輸入所查找聯(lián)系人姓名:");
scanf("%s", &delete_name);
size_t i = 0;
for (; i <addr_book->size; ++i){
if (strcmp(addr_book->data[i].name, delete_name)){
printf("找到了,該聯(lián)系人信息為:姓名:%s,號(hào)碼:%s,地址:%s\n",
addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
}
else{
printf("此人不存在!\n");
}
}
}
//修改聯(lián)系人信息
void AddrBookModify(AddrBook* addr_book){
if (addr_book == NULL){
return;
}
char name[200] = { 0 };
printf("輸入要修改的聯(lián)系人名字:");
scanf("%s", &name);
size_t i = 0;
for (; i < addr_book->size; ++i)
{
if (strcmp(addr_book->data[i].name, name) == 0)
{
printf("這是第%lu個(gè)聯(lián)系人:\n", i + 1);
printf("此人信息為:\n 姓名:%s ,電話:%s ,地址:%s\n",
addr_book->data[i].name,
addr_book->data[i].phone,
addr_book->data[i].addr);
}
}
size_t num = 0;
printf("輸入要修改的聯(lián)系人編號(hào):");
scanf("%lu", &num);
char name2[200];
char phone[200];
char addr[200];
printf("請(qǐng)輸入新的姓名:");
scanf("%s", name2);
strcpy(addr_book->data[num - 1].name, name2);
printf("請(qǐng)輸入新的電話號(hào)碼:");
scanf("%s", phone);
strcpy(addr_book->data[num - 1].phone, phone);
printf("請(qǐng)輸入新的地址:");
scanf("%s", addr);
strcpy(addr_book->data[num - 1].addr, addr);
printf("修改成功!\n");
return;
}
//銷毀通訊錄
void AddrBookDestroy(AddrBook* addr_book){
if (addr_book == NULL)
{
printf("addr_book is null\n");
return;
}
else
{
addr_book->size = 0;
addr_book->capacity = 0;
free(addr_book->data);
printf("銷毀成功!\n");
}
}
//將文件中的內(nèi)容加載回內(nèi)存
void AddrBookLoad(AddrBook* addr_book){
if (addr_book = NULL){
printf("通訊錄為空!\n");
return;
}
FILE* fp = fopen(FILE_PATH,"r");
if (fp = NULL){
printf("打開(kāi)文件失敗!\n");
return;
}
while (!feof(fp)){
if (addr_book->size >= addr_book->capacity){
AddrBookRelloc(addr_book);
}
size_t cur = addr_book->size;
fscanf(fp, "%s%s%s\n", addr_book->data[i].name, addr_book->data[i].phone, addr_book->data[i].addr);
addr_book->size++;
}
fclose(fp);
}
//===============
//以下為測(cè)試代碼
//===============
void menu(){
AddrBook addr_book;
AddrBookInit(&addr_book);
AddrBookLoad(&addr_book);
while (1){
printf("============1.打印通訊錄=============\n");
printf("============2.增加聯(lián)系人=============\n");
printf("============3.刪除聯(lián)系人=============\n");
printf("============4.查找聯(lián)系人=============\n");
printf("============5.修改聯(lián)系人=============\n");
printf("============6.銷毀通訊錄=============\n");
printf("============0.退出通訊錄=============\n");
int choice = 0;
printf("請(qǐng)輸入所需功能:");
scanf("%d", &choice);
switch (choice){
case DISPLAY:
AddrBookDisplay(&addr_book);
break;
case ADD:
AddrBookAdd(&addr_book);
AddrBookSave(&addr_book);
break;
case ERASE:
AddrBookErase(&addr_book);
break;
case FIND:
AddrBookFind(&addr_book);
break;
case MODIFY:
AddrBookModify(&addr_book);
AddrBookSave(&addr_book);
break;
case DESTROY:
AddrBookDestroy(&addr_book);
break;
case EXIT:
printf("退出通訊錄!\n");
break;
default:
printf("請(qǐng)輸入正確選擇:");
break;
}
}
}
int main(){
menu();
return 0;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入剖析C語(yǔ)言中qsort函數(shù)的實(shí)現(xiàn)原理
這篇文章主要介紹了C語(yǔ)言中qsort函數(shù)的實(shí)現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實(shí)現(xiàn)原理三個(gè)方面進(jìn)行講解,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-03-03
C語(yǔ)言中switch語(yǔ)句基本用法實(shí)例
switch的中文翻譯是開(kāi)關(guān),顧名思義,開(kāi)關(guān)的作用就是控制連通或者中斷,在C語(yǔ)言中switch語(yǔ)句的作用也是大同小異,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中switch語(yǔ)句基本用法的相關(guān)資料,需要的朋友可以參考下2022-07-07
深入分析Visual C++進(jìn)行串口通信編程的詳解
本篇文章是對(duì)Visual C++進(jìn)行串口通信編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言實(shí)現(xiàn)密碼強(qiáng)度檢測(cè)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)密碼強(qiáng)度檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
Visual Studio Code 2020安裝教程及CPP環(huán)境配置(教程圖解)
這篇文章主要介紹了Visual Studio Code 2020安裝教程、CPP環(huán)境配置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

