C語(yǔ)言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)
一、代碼展示
test.c
?使用枚舉類(lèi)型,使得菜單部分的代碼可讀性更強(qiáng),便于理解
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
void menu() {
printf("*******\ 1.add 2.del /*******\n");
printf("*******\ 3.search 4.modify /*******\n");
printf("*******\ 5.show 6.sort /*******\n");
}
int main(){
int input = 0;
Contact con; //通訊錄
//結(jié)構(gòu)體傳參
InitContact(&con); //結(jié)構(gòu)體傳參
do
{
menu();
printf("請(qǐng)選擇:> ");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
SortContact(&con);
break;
case EXIT:
SaveContact(&con);
DestroyContact(&con);
printf("退出通訊錄\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
} while (input);
return 0;
}contact.c
?在contact.c中靜態(tài)的版本無(wú)法滿足我們的需求,因此我們?cè)趧?dòng)態(tài)的版本當(dāng)中使用realloc函數(shù)就可以做到對(duì)動(dòng)態(tài)開(kāi)辟內(nèi)存大小,我們可以封裝一個(gè)函數(shù)來(lái)判斷容量是否足夠,不夠的話進(jìn)行擴(kuò)容。
?在contact.c中文件的版本可以將創(chuàng)建的數(shù)據(jù)存儲(chǔ)在本地,當(dāng)程序退出時(shí),數(shù)據(jù)依然存在,使用文件我們可以將數(shù)據(jù)直接存放在電腦的硬盤(pán)上,做到了數(shù)據(jù)的持久化。
#define _CRT_SECURE_NO_WARNINGS 1
?
#include "contact.h"
//靜態(tài)的版本
//void InitContact(Contact* pc)
//{
// assert(pc);
// pc->count = 0;
// memset(pc->data, 0, sizeof(pc->data));
//}
void CheckCapacity(Contact* pc)
{
if (pc->count == pc->capacity)
{
PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
if (ptr == NULL)
{
printf("AddContact::%s\n", strerror(errno));
return;
}
else
pc->data = ptr;
pc->capacity += INC_SZ;
printf("增容成功\n");
}
}
void LoadContact(Contact* pc)
FILE* pfRead = fopen("contact.txt", "rb");
if (pfRead == NULL)
perror("LoadContact");
return;
PeoInfo tmp = { 0 };
while (fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1)
CheckCapacity(pc);
pc->data[pc->count] = tmp;
pc->count++;
fclose(pfRead);
pfRead = NULL;
//動(dòng)態(tài)的版本
int InitContact(Contact* pc)
assert(pc);
pc->count = 0;
pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
if (pc->data == NULL)
printf("InitContact::%s\n", strerror(errno));
return 1;
pc->capacity = DEFAULT_SZ;
//加載文件的信息到通訊錄中
LoadContact(pc);
return 0;
void DestroyContact(Contact* pc)
free(pc->data);
pc->data = NULL;
//void AddContact(Contact* pc)
// if (pc->count == MAX)
// {
// printf("通訊錄已滿,無(wú)法添加\n");
// return;
// }
// //
// printf("請(qǐng)輸入名字:>");
// scanf("%s", pc->data[pc->count].name);
// printf("請(qǐng)輸入年齡:>");
// scanf("%d", &(pc->data[pc->count].age));
// printf("請(qǐng)輸入性別:>");
// scanf("%s", pc->data[pc->count].sex);
// printf("請(qǐng)輸入電話:>");
// scanf("%s", pc->data[pc->count].tele);
// printf("請(qǐng)輸入地址:>");
// scanf("%s", pc->data[pc->count].addr);
//
// pc->count++;
// printf("增加成功\n");
void AddContact(Contact* pc)
//增容
CheckCapacity(pc);
//
printf("請(qǐng)輸入名字:>");
scanf("%s", pc->data[pc->count].name);
printf("請(qǐng)輸入年齡:>");
scanf("%d", &(pc->data[pc->count].age));
printf("請(qǐng)輸入性別:>");
scanf("%s", pc->data[pc->count].sex);
printf("請(qǐng)輸入電話:>");
scanf("%s", pc->data[pc->count].tele);
printf("請(qǐng)輸入地址:>");
scanf("%s", pc->data[pc->count].addr);
pc->count++;
printf("增加成功\n");
void ShowContact(const Contact* pc)
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年齡", "性別", "電話", "地址");
for (i = 0; i < pc->count; i++)
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
static int FindByName(Contact* pc, char name[])
if (0 == strcmp(pc->data[i].name, name))
return i;
return -1;
void DelContact(Contact* pc)
char name[MAX_NAME] = { 0 };
if (pc->count == 0)
printf("通訊錄為空,沒(méi)有信息可以刪除\n");
printf("請(qǐng)輸入要?jiǎng)h除人的名字:>");
scanf("%s", name);
//刪除
//1. 查找
int pos = FindByName(pc, name);
if (pos == -1)
printf("要?jiǎng)h除的人不存在\n");
//2. 刪除
for (i = pos; i < pc->count - 1; i++)
pc->data[i] = pc->data[i + 1];
pc->count--;
printf("刪除成功\n");
void SearchContact(Contact* pc)
printf("請(qǐng)輸入要查找人的名字:>");
printf("要查找的人不存在\n");
//2. 打印
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
void ModifyContact(Contact* pc)
printf("請(qǐng)輸入要修改人的名字:>");
printf("要修改的人不存在\n");
printf("要修改的人的信息已經(jīng)查找到,接下來(lái)開(kāi)始修改\n");
//2. 修改
scanf("%s", pc->data[pos].name);
scanf("%d", &(pc->data[pos].age));
scanf("%s", pc->data[pos].sex);
scanf("%s", pc->data[pos].tele);
scanf("%s", pc->data[pos].addr);
printf("修改成功\n");
int cmp_peo_by_name(const void* e1, const void* e2)
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
//按照名字來(lái)排序
void SortContact(Contact* pc)
qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name);
printf("排序成功\n");
void SaveContact(const Contact* pc)
FILE* pfWrite = fopen("contact.txt", "wb");
if (pfWrite == NULL)
perror("SaveContact");
//寫(xiě)文件-二進(jìn)制的形式
fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);
fclose(pfWrite);
pfWrite = NULL;contact.h
#pragma once
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define DEFAULT_SZ 3
#define INC_SZ 2
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//類(lèi)型的聲明
//
//人的信息
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
} PeoInfo;
//通訊錄
//靜態(tài)版本
//typedef struct Contact
//{
// PeoInfo data[MAX];//存放人的信息
// int count;//記錄當(dāng)前通訊錄中實(shí)際人的個(gè)數(shù)
//}Contact;
//動(dòng)態(tài)的版本
typedef struct Contact
{
PeoInfo* data;//存放人的信息
int count;//記錄當(dāng)前通訊錄中實(shí)際人的個(gè)數(shù)
int capacity;//當(dāng)前通訊錄的容量
}Contact;
//初始化通訊錄
int InitContact(Contact* pc);
//銷(xiāo)毀通訊錄
void DestroyContact(Contact* pc);
//增加聯(lián)系人都通訊錄
void AddContact(Contact* pc);
//打印通訊中的信息
void ShowContact(const Contact* pc);
//刪除指定聯(lián)系人
void DelContact(Contact* pc);
//查找指定聯(lián)系人
void SearchContact(Contact* pc);
//修改指定聯(lián)系人
void ModifyContact(Contact* pc);
//排序通訊錄中內(nèi)容
//按照名字來(lái)排序
//按照年齡來(lái)排序
//...
void SortContact(Contact* pc);
//保存通訊錄的信息到文件
void SaveContact(const Contact* pc);
//加載文件的信息到通訊錄
void LoadContact(Contact* pc);二、效果展示
靜態(tài)版本基本功能的實(shí)現(xiàn)



動(dòng)態(tài)版本擴(kuò)容功能的實(shí)現(xiàn)

文件版本保存本地功能實(shí)現(xiàn)

到此這篇關(guān)于C語(yǔ)言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言通訊錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的代碼分享
- C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼
- C語(yǔ)言實(shí)現(xiàn)可保存的動(dòng)態(tài)通訊錄的示例代碼
- C語(yǔ)言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過(guò)程
- C語(yǔ)言與C++動(dòng)態(tài)通訊錄超詳細(xì)實(shí)現(xiàn)流程
- C語(yǔ)言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄詳細(xì)過(guò)程
- C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼
- C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程詳解
相關(guān)文章
C++?Boost?Accumulators累加器詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11
C語(yǔ)言+shell實(shí)現(xiàn)linux網(wǎng)卡狀態(tài)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言+shell實(shí)現(xiàn)linux網(wǎng)卡狀態(tài)檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
C++?解決求兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)問(wèn)題
本文主要介紹了利用C++實(shí)現(xiàn)輸入兩個(gè)無(wú)環(huán)的單向鏈表時(shí),找出它們的第一個(gè)公共結(jié)點(diǎn)的問(wèn)題。文章中的示例代碼簡(jiǎn)潔易懂,感興趣的同學(xué)可以和小編一起學(xué)習(xí)一下2021-12-12
C語(yǔ)言rewind與fseek函數(shù)之隨機(jī)讀寫(xiě)文件的用法詳解
這篇文章主要介紹了C語(yǔ)言rewind與fseek函數(shù)之隨機(jī)讀寫(xiě)文件的用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
C++中虛繼承時(shí)的構(gòu)造函數(shù)示例詳解
在虛繼承中,虛基類(lèi)是由最終的派生類(lèi)初始化的,換句話說(shuō),最終派生類(lèi)的構(gòu)造函數(shù)必須要調(diào)用虛基類(lèi)的構(gòu)造函數(shù),這跟普通繼承不同,在普通繼承中,派生類(lèi)構(gòu)造函數(shù)中只能調(diào)用直接基類(lèi)的構(gòu)造函數(shù),不能調(diào)用間接基類(lèi)的,所以本文將通過(guò)代碼示例給大家介紹一下C++虛繼承構(gòu)造函數(shù)2023-09-09
C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解
高精度算法的本質(zhì)是把大數(shù)拆成若干固定長(zhǎng)度的塊,然后對(duì)每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下2022-11-11

