C語(yǔ)言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)
一、代碼展示
test.c
?使用枚舉類型,使得菜單部分的代碼可讀性更強(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ù)直接存放在電腦的硬盤上,做到了數(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");
//寫文件-二進(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
//類型的聲明
//
//人的信息
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);
//銷毀通訊錄
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語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能
這個(gè)是大一時(shí)期寫的。大四的時(shí)候整理了一下(本人C語(yǔ)言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤?、僅供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來(lái)也沒(méi)有困難2021-11-11
C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何在指針中隱藏?cái)?shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-12-12
C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài)
這篇文章主要為大家詳細(xì)介紹了C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
淺談C語(yǔ)言的字節(jié)對(duì)齊 #pragma pack(n)2
下面小編就為大家?guī)?lái)一篇淺談C語(yǔ)言的字節(jié)對(duì)齊 #pragma pack(n)2。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
淺談C++的語(yǔ)句語(yǔ)法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換
這篇文章主要介紹了淺談C++的語(yǔ)句語(yǔ)法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09

