C語言示例講解動(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("請選擇:> "); 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)的版本無法滿足我們的需求,因此我們在動(dòng)態(tài)的版本當(dāng)中使用realloc函數(shù)就可以做到對動(dòng)態(tài)開辟內(nèi)存大小,我們可以封裝一個(gè)函數(shù)來判斷容量是否足夠,不夠的話進(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("通訊錄已滿,無法添加\n"); // return; // } // // // printf("請輸入名字:>"); // scanf("%s", pc->data[pc->count].name); // printf("請輸入年齡:>"); // scanf("%d", &(pc->data[pc->count].age)); // printf("請輸入性別:>"); // scanf("%s", pc->data[pc->count].sex); // printf("請輸入電話:>"); // scanf("%s", pc->data[pc->count].tele); // printf("請輸入地址:>"); // scanf("%s", pc->data[pc->count].addr); // // pc->count++; // printf("增加成功\n"); void AddContact(Contact* pc) //增容 CheckCapacity(pc); // printf("請輸入名字:>"); scanf("%s", pc->data[pc->count].name); printf("請輸入年齡:>"); scanf("%d", &(pc->data[pc->count].age)); printf("請輸入性別:>"); scanf("%s", pc->data[pc->count].sex); printf("請輸入電話:>"); scanf("%s", pc->data[pc->count].tele); printf("請輸入地址:>"); 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("通訊錄為空,沒有信息可以刪除\n"); printf("請輸入要?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("請輸入要查找人的名字:>"); 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("請輸入要修改人的名字:>"); printf("要修改的人不存在\n"); printf("要修改的人的信息已經(jīng)查找到,接下來開始修改\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); //按照名字來排序 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)容 //按照名字來排序 //按照年齡來排序 //... 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語言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言通訊錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的代碼分享
- C語言實(shí)現(xiàn)動(dòng)態(tài)版通訊錄的示例代碼
- C語言實(shí)現(xiàn)可保存的動(dòng)態(tài)通訊錄的示例代碼
- C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程
- C語言與C++動(dòng)態(tài)通訊錄超詳細(xì)實(shí)現(xiàn)流程
- C語言動(dòng)態(tài)與靜態(tài)分別實(shí)現(xiàn)通訊錄詳細(xì)過程
- C語言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼
- C語言實(shí)現(xiàn)一個(gè)文件版動(dòng)態(tài)通訊錄流程詳解
相關(guān)文章
C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài)
這篇文章主要為大家詳細(xì)介紹了C++判斷主機(jī)是否處于聯(lián)網(wǎng)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06淺談C語言的字節(jié)對齊 #pragma pack(n)2
下面小編就為大家?guī)硪黄獪\談C語言的字節(jié)對齊 #pragma pack(n)2。小編覺得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01淺談C++的語句語法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換
這篇文章主要介紹了淺談C++的語句語法與強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09