C语言 通讯录管理系统(链表,手机号码分段存储,txt文件存取)
通訊錄管理系統
- 一、需求分析
- 二、設計思路
- 三、數據
- 1、內存數據結構
- 2、文件數據
- 四、主要功能接口
- 五、問題以及解決方案
- 1.從txt文件中讀取數據到內存時
- 2.用scanf函數從stdin中讀取輸入數據,因錯誤輸入的數據可能導致scanf函數死循環的問題
- 3.itoa函數不是C語言標準庫函數,需要實現該函數
- 六、完整代碼
- 七、效果截圖
一、需求分析
設計一個通訊錄管理系統,記錄聯系人的手機號碼,姓名,聯系地址,職業,公司,郵箱。可以增加聯系人信息,刪除聯系人信息,修改聯系人信息,查找聯系人,排序,打印通訊錄信息,一鍵清空通信錄等
二、設計思路
1.根據需求分析,需要對數據進行增加,刪除,修改,查找,排序等,我選擇了雙向鏈表作為內存數據結構,考慮到每個人的手機號碼是唯一的,選擇了手機號碼作為key,同時考慮到數據量很大的情況下,可能會影響排序性能,所以考慮用手機號碼的前四位進行分段存儲,每一段對應一個鏈表,所以代碼中管理了10000條雙向鏈表,分別對應手機號碼前四位0-9999的手機號碼段。
2.數據持久化,我選擇將通訊錄內存數據保存到txt文件中,從內存數據到txt文件,用C語言庫函數提供的fopen函數和sprintf函數即可實現,從txt文件數據到內存數據,用C語言庫函數fopen函數和strtok函數即可實現。
三、數據
1、內存數據結構
聯系人信息
struct People {char tel[20]; //手機號碼char name[30]; //姓名char address[100]; //聯系地址char occupation[20]; //職業char company[40]; //公司char email[30]; //郵箱 };鏈表中的一個節點
struct People_Node {struct People people; //聯系人信息struct People_Node *next; //上一個節點struct People_Node *pre; //下一個節點 };一條鏈表
struct People_List {int len; //鏈表節點總個數struct People_Node *head; //頭節點struct People_Node *tail; //尾節點 };2、文件數據
默認 contact.txt 文件(注意最后一行是空白行)
手機號碼 姓名 聯系地址 職業 公司 郵箱contact.txt 文件 保存示例(用測試命令生產的數據)
手機號碼 姓名 聯系地址 職業 公司 郵箱 10121882476 宋八 天津 快遞員 云上科技 555@163.com 10698756589 宋八 武漢 老師 云上科技 333@qq.com 12121198969 唐九 武漢 個體 小云直播 666@163.com 14779567330 王五 廣西 個體 小蔥蔬菜 111@163.com 18817493813 李四 北京 快遞員 滕芬網絡 111@163.com四、主要功能接口
增加聯系人相關
int add_con(); //增加聯系人 int add_people(struct People people); //增加聯系人到鏈表刪除聯系人相關
int del_con(); //刪除聯系人 int del_people(struct People people); //從鏈表中刪除聯系人修改聯系人相關
int mod_con(); //修改聯系人信息 int mod_people(struct People people); //從鏈表中修改聯系人信息查找聯系人相關
int find_con(); //查找聯系人 struct People_Node *find_people(struct People people); //從鏈表中查找聯系人排序通訊錄相關
void sort_con(); //排序通訊錄 void sort_people_list(); //按照手機號碼從小到大排序通訊錄并輸出到屏幕打印通訊錄相關
void print_con(); //打印通訊錄 void print_people_list(); //打印通訊錄列表 void print_people(struct People *p); //打印聯系人信息清空通訊錄
int clean_con(); //清空通訊錄退出通訊錄
void exit_con(); //退出通訊錄五、問題以及解決方案
1.從txt文件中讀取數據到內存時
fprintf(fp, "%s %s %s %s %s %s\n", people.tel, people.name, people.address, people.occupation, people.company, people.email);問題1:如上代碼所示,因為用fprintf函數寫入到txt文件時,最后一個數據是加了\n的,所以從txt文件中讀取數據到內存數據時,應該將\0替換掉\n,再保存在內存中,如下代碼所示。
//字符串拷貝剔除掉換行符\n void strcpy_not_n(char *des, char *src) {while (*src != '\0'){if (*src != '\n')*des = *src;else*des = '\0';src++;des++;} }從txt文件中加載數據到內存代碼片段
switch (column){case 0:strcpy(people.tel, str);break;case 1:strcpy(people.name, str);break;case 2:strcpy(people.address, str);break;case 3:strcpy(people.occupation, str);break;case 4:strcpy(people.company, str);break;default:strcpy_not_n(people.email, str); //去掉\nbreak;}str = strtok(NULL, LINE);column++;問題2:因為我們存儲數據的txt文件,默認最后一行是空白行,所以從txt文件中加載數據到內存的時候,應該過濾掉空白行,不然我們從txt文件中加載數據會多了一個6個數據都為空的記錄,具體處理如下所示。
從txt文件中加載數據到內存代碼片段
char buf[BUFF_SIZE];int len = 0;int row = 0;while(fgets(buf, BUFF_SIZE, fp)){if ((row++) == 0) //第一行是注釋 手機號碼 姓名 聯系地址 職業 公司 郵箱continue;if(buf[0] == '\n') //過濾掉讀到的是空白行continue;2.用scanf函數從stdin中讀取輸入數據,因錯誤輸入的數據可能導致scanf函數死循環的問題
因為scanf函數,我們從命令行輸入數據,并按下enter換行鍵后,scanf函數會從stdin緩沖區中按照我們格式化的格式讀取輸入的數據,并且不符合讀取格式的數據會跳過,并還留在緩沖區中,直到按照我們的格式讀取到完整數據為止,并且輸入過多的未讀取的數據也還在緩沖區中,所以為了防止殘留的stdin中的垃圾數據阻礙我們下一次從stdin緩沖區中讀取到不準確的數據,我們應該在scanf函數讀取到完整數據后,對stdin緩沖區進行清空,處理如下:
//清空無效的輸入 void clean_stdin() {char s;do{scanf("%c", &s);}while(s != '\n'); }部分代碼段
scanf("%s %s %s %s %s", people.name, people.address, people.occupation, people.company, people.email);clean_stdin();3.itoa函數不是C語言標準庫函數,需要實現該函數
//數字轉字符串函數 char *itoa_my(int value, char *str, int radix) {static char dig_my[] ="0123456789""abcdefghijklmnopqrstuvwxyz";int n = 0, neg = 0;unsigned int v;char* p, *q;char c;/* 負數:十進制直接在前面加負號,其它進制用補碼 */if (radix == 10 && value < 0) {v = -value;neg = 1;}else{v = value;}/* 其它進制的負數轉為unsigned int類型,即取了補碼 */do {str[n++] = dig_my[v%radix];v /= radix;} while (v);if (neg)str[n++] = '-';str[n] = '\0';/* 字符串反轉 */for (p = str, q = p + (n-1); p < q; ++p, --q)c = *p, *p = *q, *q = c;return str; }六、完整代碼
contact.h 文件
#ifndef CONTACT_H #define CONTACT_H#define CON_TXT_PATH "./contact.txt" #define BUFF_SIZE 256 #define LINE " " //分割符號 #define COUNT_TEL_MAX 9999 #define RETURN_MAIN ".." #define RETURN_MAIN_FLAG 100 #define PEOPLE_INFO "手機號碼\t姓名\t聯系地址\t職業\t公司\t郵箱\n"enum OPTION {TEST = 0,ADD = 1,DEL,MOD,FIND,SORT,PRINT,CLEAN,EXIT,END };//聯系人信息 struct People {char tel[20]; //手機號碼char name[30]; //姓名char address[100]; //聯系地址char occupation[20]; //職業char company[40]; //公司char email[30]; //郵箱 };//鏈表中的一個節點 struct People_Node {struct People people; //聯系人信息struct People_Node *next; //上一個節點struct People_Node *pre; //下一個節點 };//一個鏈表 struct People_List {int len; //鏈表節點總個數struct People_Node *head; //頭節點struct People_Node *tail; //尾節點 };//手機號碼前四位對應的鏈表集合 struct People_List *g_tel[COUNT_TEL_MAX];void display_menu(); //列出功能菜單 int init_con(); //初始化通訊錄 int load_con(); //從txt文件中加載通訊錄int add_con(); //增加聯系人 int add_people(struct People people); //增加聯系人到鏈表int del_con(); //刪除聯系人 int del_people(struct People people); //從鏈表中刪除聯系人int mod_con(); //修改聯系人信息 int mod_people(struct People people); //從鏈表中修改聯系人信息int find_con(); //查找聯系人 struct People_Node *find_people(struct People people); //從鏈表中查找聯系人void sort_con(); //排序通訊錄 void sort_people_list(); //按照手機號碼從小到大排序通訊錄并輸出到屏幕void print_con(); //打印通訊錄 void print_people_list(); //打印通訊錄列表 void print_people(struct People *p); //打印聯系人信息int clean_con(); //清空通訊錄void exit_con(); //退出通訊錄int test_cmd(); //測試命令//輔助函數 void clean_stdin(); //清空無效的輸入 int check_return_main(const char *str); //是否返回主菜單 int get_key(const char *tel); //返回手機號碼對應的數組數組下標 int is_digit_string(const char *str); //檢測str是否為全數字 int check_people(struct People people); //檢測輸入的格式比如手機號碼格式是否正確等 void strcpy_not_n(char *des, char *src); //字符串拷貝剔除掉換行符\n void save_people_list(); //保持數據到txt文件 char *itoa_my(int value, char *str, int radix); //數字轉字符串函數#endifcontact.c 文件
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <ctype.h> #include <time.h> #include "contact.h"extern int errno;int main() {srand((unsigned)time(NULL)); /*播種子*/init_con();enum OPTION op = 0;int r = 0;while(1){display_menu();r = scanf("%d", &op);if (r == 0 || op < TEST || op >= END) {clean_stdin();printf("輸入錯誤,請重新選擇功能\n");continue;}switch(op){case TEST:{while(1){r = test_cmd();if (r == RETURN_MAIN_FLAG)break;}break;}case ADD:{while(1){r = add_con();if (r == RETURN_MAIN_FLAG)break;}break;}case DEL:{while(1){r = del_con();if (r == RETURN_MAIN_FLAG)break;}break;}case MOD:{while(1){r = mod_con();if (r == RETURN_MAIN_FLAG)break;}break;}case FIND:{while(1){r = find_con();if (r == RETURN_MAIN_FLAG)break;}break;}case SORT:sort_con();break;case PRINT:print_con();break;case CLEAN:{while(1){r = clean_con();if (r != 0)break;}break;}case EXIT:exit_con();break;default:break;}}return 0; }//列出功能菜單 void display_menu() {printf("*****************************************************************************************\n");printf("** 通訊錄 **\n");printf("** **\n");printf("** 請選擇功能 **\n");printf("** 0:測試命令 **\n");printf("** 1:增加聯系人 **\n");printf("** 2:刪除聯系人 **\n");printf("** 3:修改聯系人 **\n");printf("** 4:查找聯系人 **\n");printf("** 5:排序聯系人 **\n");printf("** 6:打印通訊錄 **\n");printf("** 7:清空通訊錄 **\n");printf("** 8:退出 **\n");printf("** **\n");printf("** 在子功能下輸入:.. 返回到主目錄 **\n");printf("** **\n");printf("*****************************************************************************************\n"); }//初始化通訊錄 int init_con() {int i = 0;for (i = 0; i < COUNT_TEL_MAX; i++){struct People_List *list = (struct People_List *)malloc(sizeof(struct People_List));list->len = 0;list->head = NULL;list->tail = NULL;g_tel[i] = list;}return load_con(); }//從contact.txt文件中加載通訊錄 int load_con() {FILE *fp = fopen(CON_TXT_PATH, "r");if (!fp){fprintf(stderr, "打開%s文件錯誤:%s\n", CON_TXT_PATH, strerror(errno));return 0;}char buf[BUFF_SIZE];int len = 0;int row = 0;while(fgets(buf, BUFF_SIZE, fp)){if ((row++) == 0) //第一行是注釋 手機號碼 姓名 聯系地址 職業 公司 郵箱continue;if(buf[0] == '\n') //過濾掉讀到的是空白行continue;int column = 0;struct People people;char *str = strtok(buf, LINE);while(str){switch (column){case 0:strcpy(people.tel, str);break;case 1:strcpy(people.name, str);break;case 2:strcpy(people.address, str);break;case 3:strcpy(people.occupation, str);break;case 4:strcpy(people.company, str);break;default:strcpy_not_n(people.email, str); //去掉\nbreak;}str = strtok(NULL, LINE);column++;}add_people(people);row++;}fclose(fp);//print_people_list();return 1; }//增加聯系人 int add_con() {printf("請輸入手機號碼 姓名 聯系地址 職業 公司 郵箱\n");struct People people; scanf("%s", people.tel);if(check_return_main(people.tel)){clean_stdin();return RETURN_MAIN_FLAG;}scanf("%s %s %s %s %s", people.name, people.address, people.occupation, people.company, people.email);clean_stdin();int r = check_people(people);if (r == -1)return 0;if (find_people(people)){ printf("手機號碼:%s 的聯系人已經存在!\n", people.tel);return 0;}r = add_people(people);if (!r)return 0;//print_people_list();FILE *fp = fopen(CON_TXT_PATH, "a+"); /*打開一個文本文件,允許讀寫文件。如果文件不存在,則會創建一個新文件。讀取會從文件的開頭開始,寫入則只能是追加模式。*/if (!fp){fprintf(stderr, "打開%s文件錯誤:%s\n", CON_TXT_PATH, strerror(errno));return 0;}fprintf(fp, "%s %s %s %s %s %s\n", people.tel, people.name, people.address, people.occupation, people.company, people.email);fclose(fp);printf("添加聯系人成功!\n");return 1; }//增加聯系人到鏈表 int add_people(struct People people) {struct People_List *plist = NULL;//加入手機號碼對應的鏈表庫struct People_Node *pnode = (struct People_Node *)malloc(sizeof(struct People_Node));if (!pnode){fprintf(stderr, "申請內存失敗:%s\n", strerror(errno));return 0;}pnode->people = people;pnode->pre = NULL;pnode->next = NULL;int key = get_key(people.tel);plist = g_tel[key];if ((plist->len++) == 0) //鏈表為空時{plist->head = pnode;plist->tail = pnode;} else {pnode->pre = plist->tail;plist->tail->next = pnode;plist->tail = pnode;}return 1; }//刪除聯系人 int del_con() { printf("請輸入要刪除的聯系人的手機號碼\n");struct People people;int r = scanf("%s", &people.tel);clean_stdin();if(check_return_main(people.tel))return RETURN_MAIN_FLAG;if (r == 0) {printf("輸入手機號碼格式不正確--------r = %d\n", r);return 0;}r = check_people(people);if (r == -1)return 0;return del_people(people); }//從鏈表中刪除聯系人 int del_people(struct People people) {int key = get_key(people.tel);struct People_Node *pnode = g_tel[key]->head;int find = 0;while(pnode){if (strcmp(people.tel, pnode->people.tel) == 0){find = 1;break;} pnode = pnode->next;}if (!find){printf("沒有找到要刪除的聯系人\n");return 0;}g_tel[key]->len = g_tel[key]->len - 1;if (pnode == g_tel[key]->head){g_tel[key]->head = pnode->next;if (g_tel[key]->len == 0)g_tel[key]->tail = NULL;else pnode->next->pre = NULL;} else if (pnode == g_tel[key]->tail) {g_tel[key]->tail = pnode->pre;pnode->pre->next = NULL;} else {pnode->pre->next = pnode->next;pnode->next->pre = pnode->pre;}free(pnode);//print_people_list();save_people_list();printf("刪除聯系人成功!\n");return 1; }//修改聯系人信息 int mod_con() {printf("請輸入需要修改聯系人的 手機號碼 姓名 聯系地址 職業 公司 郵箱\n");struct People people;scanf("%s", people.tel);if(check_return_main(people.tel)){clean_stdin();return RETURN_MAIN_FLAG;}scanf("%s %s %s %s %s", people.name, people.address, people.occupation, people.company, people.email);clean_stdin();if(check_return_main(people.tel))return RETURN_MAIN_FLAG;int r = check_people(people);if (r == -1)return 0;return mod_people(people); }//從鏈表中修改聯系人信息 int mod_people(struct People people) {int key = get_key(people.tel);struct People_Node *pnode = g_tel[key]->head;int find = 0;while(pnode){if (strcmp(people.tel, pnode->people.tel) == 0){find = 1;break;} pnode = pnode->next;}if (!find){printf("沒有找到要修改的聯系人\n");return 0;}pnode->people = people;//print_people_list();save_people_list();printf("修改聯系人成功!\n");return 1; }//查找聯系人 int find_con() {printf("請輸入要查找的聯系人的手機號碼\n");struct People people;int r = scanf("%s", &people.tel);clean_stdin();if(check_return_main(people.tel))return RETURN_MAIN_FLAG;if (r == 0) {printf("輸入手機號碼格式不正確\n");return 0;}r = check_people(people);if (r == -1)return 0;struct People_Node *pnode = find_people(people);if (!pnode){printf("沒有查找到手機號碼對應的聯系人!\n");return 0;}printf(PEOPLE_INFO);print_people(&pnode->people);return 1; }//從鏈表中查找聯系人 struct People_Node *find_people(struct People people) {int key = get_key(people.tel);struct People_Node *pnode = g_tel[key]->head;while(pnode){if (strcmp(people.tel, pnode->people.tel) == 0){return pnode;} pnode = pnode->next;}return NULL; }//排序通訊錄 void sort_con() {sort_people_list(); }//按照手機號碼從小到大排序通訊錄并輸出到屏幕 void sort_people_list() {// printf("---------------before sort---------------\n");// print_people_list();struct People_List *plist = NULL;struct People_Node *pnode = NULL;struct People_Node *pnext = NULL;struct People_Node *pmin = NULL;struct People ptemp;int i = 0;for (i = 0; i < COUNT_TEL_MAX; i++){plist = g_tel[i];pnode = plist->head;while (pnode){pmin = pnode;//ptemp = pnode;pnext = pnode->next;while(pnext){if (atof(pmin->people.tel) > atof(pnext->people.tel))pmin = pnext;pnext = pnext->next;}if (pmin != pnode) //當前節點不是最小節點{ptemp = pnode->people;pnode->people = pmin->people;pmin->people = ptemp;}pnode = pnode->next;} }// printf("---------------after sort---------------\n");// print_people_list();printf("排序成功!\n"); }//打印通訊錄 void print_con() {printf("----------開始打印通訊錄----------\n");print_people_list();printf("----------打印通訊錄完畢----------\n"); }//打印通訊錄列表 void print_people_list() {int i = 0;struct People_Node *pnode;printf(PEOPLE_INFO);for (i = 0; i < COUNT_TEL_MAX; i++){pnode = g_tel[i]->head;while (pnode){//printf("key = %d ", i);print_people(&(pnode->people));pnode = pnode->next;}} }//打印聯系人信息 void print_people(struct People *p) {printf("%s\t%s\t%s\t%s\t%s\t%s\n", p->tel, p->name, p->address, p->occupation, p->company, p->email); }//清空通訊錄 int clean_con() {printf("是否清空通訊錄:y or n\n");char op[100];int r = scanf("%s", &op);clean_stdin();if (check_return_main(op) || strcmp(op, "n") == 0)return RETURN_MAIN_FLAG;if (strcmp(op, "y") != 0){printf("輸入:y or n 錯誤!\n");return 0;}printf("----------開始清空通訊錄,開始釋放內存數據----------\n");int i = 0;struct People_List *plist;struct People_Node *pcur = NULL;struct People_Node *pnext = NULL;for (i = 0; i < COUNT_TEL_MAX; i++){plist = g_tel[i];pcur = plist->head;while (pcur){pnext = pcur->next;//printf("free node tel = %s\n", pcur->people.tel);free(pcur);pcur = pnext;}plist->len = 0;plist->head = NULL;plist->tail = NULL;}save_people_list();printf("----------釋放內存數據成功,清空通訊錄成功----------\n");return 1; }//退出通訊錄 void exit_con() {printf("----------開始保存通訊錄----------\n");save_people_list();printf("----------開始退出通訊錄,開始釋放內存數據----------\n");int i = 0;struct People_List *plist;struct People_Node *pcur = NULL;struct People_Node *pnext = NULL;for (i = 0; i < COUNT_TEL_MAX; i++){plist = g_tel[i];pcur = plist->head;while (pcur){pnext = pcur->next;//printf("free node tel = %s\n", pcur->people.tel);free(pcur);pcur = pnext;}free(plist);}printf("----------釋放內存數據成功,退出通訊錄成功----------\n");exit(1); }//清空無效的輸入 void clean_stdin() {char s;do{scanf("%c", &s);}while(s != '\n'); }//是否返回主菜單 int check_return_main(const char *str) {if (strcmp(str, RETURN_MAIN) == 0)return 1;return 0; }//返回手機號碼對應的數組數組下標 int get_key(const char *tel) {char str[5];memcpy(str, tel, 4);int key = atoi(str);if (key > COUNT_TEL_MAX || key < 0)return -1;return key; }//檢測str是否為全數字 int is_digit_string(const char *str) {if (*str == '\0')return 0;while (*str != '\0'){if(!isdigit(*str++))return 0;}return 1; }// 檢測輸入的格式比如手機號碼格式是否正確等 int check_people(struct People people) {if (!is_digit_string(people.tel)) //是否是數字{printf("手機號碼格式不全是數字\n");return -1;}if (strlen(people.tel) < 4) //手機號碼是否過短{printf("手機號碼不能低于4位\n");return -1;}return 0; }//字符串拷貝剔除掉換行符\n void strcpy_not_n(char *des, char *src) {while (*src != '\0'){if (*src != '\n')*des = *src;else*des = '\0';src++;des++;} }//保持數據到txt文件 void save_people_list() {FILE *fp = fopen(CON_TXT_PATH, "w"); /*打開一個文本文件,允許讀寫文件。如果文件不存在,則會創建一個新文件。讀取會從文件的開頭開始,寫入則只能是追加模式。*/if (!fp){fprintf(stderr, "打開%s文件錯誤:%s\n", CON_TXT_PATH, strerror(errno));return ;}int i = 0;fprintf(fp, "手機號碼 姓名 聯系地址 職業 公司 郵箱\n");int interval = 3;char dest[1024] = "";char str[256] = "";int record = 0;struct People_Node *pnode = NULL;for (i = 0; i < COUNT_TEL_MAX; i++){pnode = g_tel[i]->head;while (pnode){ record = record + 1;sprintf(str, "%s %s %s %s %s %s\n", pnode->people.tel, pnode->people.name, pnode->people.address, pnode->people.occupation, pnode->people.company, pnode->people.email);strcat(dest, str);strcpy(str, "");if (record%interval == 0){fprintf(fp, dest);record = 0;strcpy(dest, "");}pnode = pnode->next;}}if (strcmp(dest, "") != 0)fprintf(fp, dest);fclose(fp); }//測試命令 int test_cmd() {printf("1:隨機增加n個聯系人,例如:1 1000 就是隨機增加1000個聯系人\n");char cmd1[20];int cmd2 = 0;scanf("%s", &cmd1);if(check_return_main(cmd1)){clean_stdin();return RETURN_MAIN_FLAG;}scanf("%d", &cmd2);clean_stdin();if (atoi(cmd1) != 1 || cmd2 <= 0){printf("輸入的測試命令格式不對\n");return 0;}char *family_names[10] = {"李一一","歐陽二","張三","李四","王五","易六","高七","宋八","唐九","楊十"};char *address[10] = {"廣州","上海","天津","北京","武漢","拉薩","新疆","河北","河南","廣西"};char *occupation[10] = {"老師","快遞員","工程師","個體","醫生","護士","培訓師","務農","健身教練","CEO"};char *company[10] = {"滕芬網絡","云上科技","佳佳超市","水煮魚餐飲","來一杯奶茶","好多好吃","小蔥蔬菜","水果批發商","酸菜魚特產","小云直播"};char *email[10] = {"111@163.com","222@qq.com","333@qq.com","444@163.com","555@163.com","666@163.com","777@163.com","888@qq.com","999@qq.com","123@163.com"};struct People people;int i = 0, j = 0;int temp;char tel[12] = "1";char str[2];for (i = 0; i < cmd2; i ++){for (j = 0; j < 10; j++){temp = (int)rand()%10;//printf("%d\n", temp);itoa_my(temp, str, 10);strcat(tel, str);strcpy(str, "");}strcpy(people.tel, tel);strcpy(people.name, family_names[(int)rand()%10]);strcpy(people.address, address[(int)rand()%10]);strcpy(people.occupation, occupation[(int)rand()%10]);strcpy(people.company, company[(int)rand()%10]);strcpy(people.email, email[(int)rand()%10]);//printf("%s\n", tel);add_people(people);strcpy(tel, "1");}save_people_list();printf("新增聯系人成功\n");return 1; }//數字轉字符串函數 char *itoa_my(int value, char *str, int radix) {static char dig_my[] ="0123456789""abcdefghijklmnopqrstuvwxyz";int n = 0, neg = 0;unsigned int v;char* p, *q;char c;/* 負數:十進制直接在前面加負號,其它進制用補碼 */if (radix == 10 && value < 0) {v = -value;neg = 1;}else{v = value;}/* 其它進制的負數轉為unsigned int類型,即取了補碼 */do {str[n++] = dig_my[v%radix];v /= radix;} while (v);if (neg)str[n++] = '-';str[n] = '\0';/* 字符串反轉 */for (p = str, q = p + (n-1); p < q; ++p, --q)c = *p, *p = *q, *q = c;return str; }七、效果截圖
首頁
測試命令增加10個聯系人,并打印通訊錄
退出通訊錄
總結
以上是生活随笔為你收集整理的C语言 通讯录管理系统(链表,手机号码分段存储,txt文件存取)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLECS专家的教诲
- 下一篇: 基于C语言通讯录管理系统编程设计