C語言多功能動態(tài)通訊錄實(shí)現(xiàn)示例
前言
本文將模塊化地介紹如何實(shí)現(xiàn)一個動態(tài)開辟空間的通訊錄,其有以下九個功能:
- 打印主菜單
- 添加聯(lián)系人
- 刪除聯(lián)系人
- 打印通訊錄
- 查找聯(lián)系人
- 修改聯(lián)系人
- 置頂聯(lián)系人
- 排序聯(lián)系人
- 退出通訊錄
一、預(yù)設(shè)置
1,頭文件的包含
需要用到的頭文件有以下幾個
#include<stdio.h>//輸入輸出 #include<stdlib.h>//使用qsort #include<string.h>//使用strcmp #include<Windows.h>//使用systeam(“cls”) #include<assert.h>//使用assert()
2,聯(lián)系人的信息格式
在此將每個聯(lián)系人的信息暫定為五項(xiàng),分別是姓名、性別、年齡、電話、住址,因?yàn)橐獮楹竺?strong>第八個功能——聯(lián)系人置頂做準(zhǔn)備,因此多加入一個int型變量,用于判斷該聯(lián)系人是否被置頂,像這樣:
//創(chuàng)建每個聯(lián)系人的信息格式 typedef struct { char name[max_name]; char sex[max_sex]; int age; char tele[max_tele]; char add[max_add]; int first;//聯(lián)系人是否被置頂 }people;//聯(lián)系人類型
以上代碼中以max_開頭的數(shù)據(jù)將在稍后的宏定義中介紹。
3,通訊錄的信息格式
創(chuàng)建關(guān)于通訊錄的信息格式的結(jié)構(gòu)體是為了將當(dāng)前通訊錄人數(shù)和通訊錄當(dāng)前可以容納的總?cè)藬?shù)兩個變量放在一個結(jié)構(gòu)體變量里面,便于以后的代碼傳參,像這樣:
//創(chuàng)建通訊錄格式 typedef struct { people* peoples;//開辟空間后用來維護(hù)空間的指針 int sz;//當(dāng)前人數(shù) int all;//總?cè)菁{人數(shù) }contact;通訊錄類型
4,通訊錄相關(guān)宏定義
為了便于日后修改,使用宏定義一些常量。
#define _CRT_SECURE_NO_WARNINGS 1//博主的環(huán)境是VS2019 #define init_num_people 10//通訊錄初始的人數(shù) #define oncetime 5//通訊錄每次擴(kuò)容增加的人數(shù) #define max_name 10 #define max_sex 4 #define max_tele 11 #define max_add 40
5,通訊錄功能枚舉
用可以看出含義的英文單詞縮寫來代替數(shù)字,可以方便我們寫代碼,像這樣:
enum MyEnum//對九種通訊錄功能進(jìn)行枚舉 { MENU = 1,//菜單 ADD,//添加 DEL,//刪除 PRIN,//打印 FIND,//查找 CHANGE,//修改 FIRST,//置頂 SORT,//排序 EXIT//退出 };
6,基本主函數(shù)
總的思路是創(chuàng)建一個剛剛設(shè)置的枚舉變量,讓用戶輸入數(shù)字代表其選擇的功能,利用分支語句進(jìn)入不同的函數(shù)。最后不要忘了釋放內(nèi)存哦。
int main() { //創(chuàng)建通訊錄 contact con; //初始化 init_con(&con); enum MyEnum input = 0; do { menu();//打印菜單 scanf("%d", &input); switch (input) { case MENU: system("cls");//清屏后break,自動打印菜單 break; case ADD: add_people(&con);//增加聯(lián)系人 break; case DEL: del_people(&con);//刪除聯(lián)系人 break; case PRIN: PRIN_CON(&con);//打印通訊錄 break; case FIND: find_people(&con);//查找聯(lián)系人 break; case CHANGE: change_people(&con);//修改聯(lián)系人 break; case FIRST: fir_people(&con);//設(shè)置置頂 break; case SORT: sort_people(&con);//聯(lián)系人排序 break; case EXIT: free(con.peoples); con.peoples = NULL; system("cls"); printf("退出通訊錄!\n"); break; } } while (input-EXIT);//只有選擇9才退出 return 0; }
二、功能函數(shù)實(shí)現(xiàn)
1,初始化函數(shù)
此函數(shù)中將為通訊錄開辟空間,對值進(jìn)行初始化。
//初始化 void init_con(contact* con) { assert(con); con->peoples = (people*)malloc(init_num_people * sizeof(people));//為聯(lián)系人信息開辟空間 if (con->peoples == NULL) { perror("warning::function::9");//開辟失敗報(bào)錯,顯示錯誤位置 return 0; } memset(con->peoples, 0, init_num_people * sizeof(people));//把空間初始化為0 con->sz = 0;//sz是通訊錄當(dāng)前人數(shù) con->all = init_num_people;//all是通訊錄當(dāng)前可以容納的總?cè)藬?shù) }
2,查找函數(shù)
因?yàn)橥ㄓ嶄浻性S多功能(刪除,查找,修改,置頂)都需要用到查找,于是寫出一個公用函數(shù),用于通過姓名查找通訊錄中的聯(lián)系人,若找到則返回其下標(biāo),若找不到則返回sz。
//查找函數(shù),用于通過姓名查找通訊錄中的聯(lián)系人下標(biāo),若找到返回下標(biāo),若找不到返回sz int find(contact* con,const char* name) { assert(con); int i = 0; for (i = 0; i < con->sz; i++) { if (strcmp(name, con->peoples[i].name) == 0) { return i; } } return i; }
3,打印菜單
打印菜單,讓用戶進(jìn)行選擇。
//打印菜單 void menu() { printf("1,打印主菜單\n"); printf("2,添加聯(lián)系人\n"); printf("3,刪除聯(lián)系人\n"); printf("4,打印通訊錄\n"); printf("5,查找聯(lián)系人\n"); printf("6,修改聯(lián)系人\n"); printf("7,置頂聯(lián)系人\n"); printf("8,聯(lián)系人排序\n"); printf("9,退出通訊錄\n"); printf("請選擇:"); }
4,增加聯(lián)系人
為通訊錄添加一個聯(lián)系人。
//增加聯(lián)系人 void add_people(contact* con) { assert(con); system("cls");//為了美觀,清屏 if (con->sz == con->all) { people* ptr = (people*)realloc(con->peoples, (con->all+oncetime)*sizeof(people));//增加一次擴(kuò)容的空間 if (ptr == NULL) { perror("worning::function::40"); return 0; } con->peoples = ptr; ptr = NULL; memset(con->peoples + con->sz, 0, oncetime * sizeof(people));//把空間初始化為0 con->all++; printf("\n擴(kuò)容成功\n"); } printf("請輸入姓名:"); scanf("%s", con->peoples[con->sz].name); printf("請輸入性別:"); scanf("%s", con->peoples[con->sz].sex); printf("請輸入年齡:"); scanf("%d", &con->peoples[con->sz].age); printf("請輸入電話:"); scanf("%s", con->peoples[con->sz].tele); printf("請輸入住址:"); scanf("%s", con->peoples[con->sz].add); con->sz++; system("cls"); printf("添加成功!\n"); }
5,刪除聯(lián)系人
利用查找函數(shù),找到后刪除,不要忘記將后面的聯(lián)系人信息向前移。
//刪除聯(lián)系人 void del_people(contact* con) { assert(con); system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要刪除的聯(lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { printf("您的通訊錄中沒有名為“%s”的聯(lián)系人\n", h); return; } memset(con->peoples + flag, 0, sizeof(people)); int i = 0; for (i = flag; i < con->sz-1; i++) { people tmp = con->peoples[i]; con->peoples[i] = con->peoples[i + 1]; con->peoples[i + 1] = tmp; } con->sz--; system("cls"); printf("刪除成功!\n"); }
6,查找聯(lián)系人
通訊錄人太多了怎么辦?沒關(guān)系,你可以使用查找,該函數(shù)后面的打印格式將與打印函數(shù)模塊相同。
//查找聯(lián)系人 void find_people(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要查找的聯(lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { system("cls"); printf("您的通訊錄中沒有名為“%s”的聯(lián)系人\n", h); return; } printf("********************************************\n"); printf("姓名 性別 年齡 電話 住址\n"); printf("%-10s%-8s%-6d%-11s%s\n", con->peoples[flag].name, con->peoples[flag].sex, con->peoples[flag].age, con->peoples[flag].tele, con->peoples[flag].add); printf("********************************************\n"); }
7,修改聯(lián)系人
老樣子,先查找,找到以后讓用戶再輸入一次。
//修改聯(lián)系人 void change_people(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要修改的聯(lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { printf("您的通訊錄中沒有名為“%s”的聯(lián)系人", h); return; } printf("您想將姓名修改為:"); scanf("%s", con->peoples[flag].name); printf("您想將性別修改為:"); scanf("%s", con->peoples[flag].sex); printf("您想將年齡修改為:"); scanf("%d", &con->peoples[flag].age); printf("您想將電話修改為:"); scanf("%s", con->peoples[flag].tele); printf("您想將住址修改為:"); scanf("%s", con->peoples[flag].add); printf("修改完成!\n"); }
8,設(shè)置置頂
將聯(lián)系人設(shè)為通訊錄的置頂,無論在任何的排序情況下,都會先打印置頂?shù)穆?lián)系人。當(dāng)然,你也可以取消置頂。
//設(shè)置置頂 void fir_people(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要置頂或取消置頂?shù)穆?lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { printf("您的通訊錄中沒有名為“%s”的聯(lián)系人", h); return; } if (con->peoples[flag].first == 1)//成員變量first為1則已經(jīng)被置頂 { con->peoples[flag].first = 0; } else if (con->peoples[flag].first == 0)//成員變量first為0則還沒被置頂 { con->peoples[flag].first = 1; } printf("設(shè)置成功!\n"); }
9,聯(lián)系人排序
在此設(shè)置了三種排序方式,排序方法利用qsort。
1,性別(先女后男)
2,年齡(由小到大)
3,電話(由小到大)
//聯(lián)系人排序 int sex_cmp(const void* str1,const void* str2)//性別排序 { people* a = (people*)str1; people* b = (people*)str2; return -strcmp(a->sex, b->sex); } int age_cmp(const void* str1, const void* str2)//年齡排序 { people* a = (people*)str1; people* b = (people*)str2; return (a->age - b->age); } int tele_cmp(const void* str1, const void* str2)//電話排序 { people* a = (people*)str1; people* b = (people*)str2; return strcmp(a->tele, b->tele); } void sort_people(contact* con) { system("cls"); printf("請選擇排序標(biāo)準(zhǔn)\n"); printf("1,性別\n"); printf("2,年齡\n"); printf("3,電話\n"); printf("請選擇:"); int n = 0; scanf("%d", &n); if(n==1) qsort(con->peoples, con->sz, sizeof(people), sex_cmp); else if(n==2) qsort(con->peoples, con->sz, sizeof(people), age_cmp); else if(n==3) qsort(con->peoples, con->sz, sizeof(people), tele_cmp); printf("排序成功!\n"); PRIN_CON(con); }
10,聯(lián)系人打印
打印所有的聯(lián)系人,因?yàn)橛兄庙敼δ艿拇嬖?,需要遍歷兩次,第一次打印被置頂?shù)穆?lián)系人,第二次打印沒有被置頂?shù)穆?lián)系人,像這樣:
//打印通訊錄 void PRIN_CON(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("********************************************\n"); printf("姓名 性別 年齡 電話 住址\n"); int i = 0; for (i = 0; i < con->sz; i++) { if(con->peoples[i].first==1) printf("%-10s%-8s%-6d%-11s%s\n", con->peoples[i].name, con->peoples[i].sex, con->peoples[i].age, con->peoples[i].tele, con->peoples[i].add); } for (i = 0; i < con->sz; i++) { if (con->peoples[i].first != 1) printf("%-10s%-8s%-6d%-11s%s\n", con->peoples[i].name, con->peoples[i].sex, con->peoples[i].age, con->peoples[i].tele, con->peoples[i].add); } printf("********************************************\n"); }
至于這打印格式,保持一致即可。
三、優(yōu)化思路
1,查找函數(shù)優(yōu)化
利用strstr實(shí)現(xiàn)對信息的檢索,就不必死板地搜索全名了,例如你可以搜索“張三”,以此檢索在姓名、地址、簡介等所有包括“張三”的信息并返回其聯(lián)系人的信息。
2,額外功能優(yōu)化
可以額外增加收藏夾,黑名單,群組等等功能,在聯(lián)系人信息格式里面多加幾個變量即可,只是在打印的時候需要多加注意一些相悖的功能,例如進(jìn)入黑名單后應(yīng)自動取消置頂、收藏等。且打印時不再打印黑名單內(nèi)的聯(lián)系人。
3,打印優(yōu)化
設(shè)置更多的打印方法,例如單獨(dú)打印黑名單,單獨(dú)打印置頂,單獨(dú)打印收藏夾等等。亦可以設(shè)置打印打印聯(lián)系人的某項(xiàng)信息,例如只打印姓名,只打印電話等等。
四、源代碼
下面放出源代碼,可以直接用哦
1,head.h
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<Windows.h> #include<assert.h> #define init_num_people 10//通訊錄初始的人數(shù) #define oncetime 5//通訊錄每次擴(kuò)容增加的人數(shù) #define max_name 10 #define max_sex 4 #define max_tele 11 #define max_add 40 enum MyEnum//對九種通訊錄功能進(jìn)行枚舉 { MENU = 1, ADD, DEL, PRIN, FIND, CHANGE, FIRST, SORT, EXIT }; //創(chuàng)建每個聯(lián)系人的信息格式 typedef struct { char name[max_name]; char sex[max_sex]; int age; char tele[max_tele]; char add[max_add]; int first;//聯(lián)系人是否被置頂 }people; //創(chuàng)建通訊錄格式 typedef struct { people* peoples;//用來維護(hù)聯(lián)系人信息的指針 int sz;//當(dāng)前人數(shù) int all;//總?cè)菁{人數(shù) }contact; //功能函數(shù) void init_con(contact* con);//初始化 void menu();//打印菜單 void PRIN_CON(contact* con);//打印通訊錄 void find_people(contact* con);//查找聯(lián)系人 void change_people(contact* con);//修改聯(lián)系人 void fir_people(contact* con);//設(shè)置置頂 void sort_people(contact* con);//聯(lián)系人排序 //常用函數(shù) int find(contact* con, const char* name);//查找函數(shù),參數(shù)2為需要查找的姓名,若找到返回下標(biāo),找不到返回sz
2,sour.c
#include"head.h" int main() { //創(chuàng)建通訊錄 contact con; //初始化 init_con(&con); enum MyEnum input = 0; do { //打印菜單 menu(); scanf("%d", &input); switch (input) { case MENU: system("cls");//清屏后break,自動打印菜單 break; case ADD: add_people(&con);//增加聯(lián)系人 break; case DEL: del_people(&con);//刪除聯(lián)系人 break; case PRIN: PRIN_CON(&con);//打印通訊錄 break; case FIND: find_people(&con);//查找聯(lián)系人 break; case CHANGE: change_people(&con);//修改聯(lián)系人 break; case FIRST: fir_people(&con);//設(shè)置置頂 break; case SORT: sort_people(&con);//聯(lián)系人排序 break; case EXIT: free(con.peoples); con.peoples = NULL; system("cls"); printf("退出通訊錄!\n"); break; } } while (input-EXIT);//只有選擇9才退出 return 0; }
3,function.c
#include"head.h" //初始化 void init_con(contact* con) { assert(con); con->peoples = (people*)malloc(init_num_people * sizeof(people));//為聯(lián)系人信息開辟空間 if (con->peoples == NULL) { perror("warning::function::9");//開辟失敗報(bào)錯,顯示錯誤位置 return 0; } memset(con->peoples, 0, init_num_people * sizeof(people));//把空間初始化為0 con->sz = 0; con->all = init_num_people; } //打印菜單 void menu() { printf("1,打印主菜單\n"); printf("2,添加聯(lián)系人\n"); printf("3,刪除聯(lián)系人\n"); printf("4,打印通訊錄\n"); printf("5,查找聯(lián)系人\n"); printf("6,修改聯(lián)系人\n"); printf("7,置頂聯(lián)系人\n"); printf("8,聯(lián)系人排序\n"); printf("9,退出通訊錄\n"); printf("請選擇:"); } //增加聯(lián)系人 void add_people(contact* con) { assert(con); system("cls");//為了美觀,清屏 if (con->sz == con->all) { people* ptr = (people*)realloc(con->peoples, (con->all+oncetime)*sizeof(people));//增加一次擴(kuò)容的空間 if (ptr == NULL) { perror("worning::function::40"); return 0; } con->peoples = ptr; ptr = NULL; memset(con->peoples + con->sz, 0, oncetime * sizeof(people));//把空間初始化為0 con->all++; printf("\n擴(kuò)容成功\n"); } printf("請輸入姓名:"); scanf("%s", con->peoples[con->sz].name); printf("請輸入性別:"); scanf("%s", con->peoples[con->sz].sex); printf("請輸入年齡:"); scanf("%d", &con->peoples[con->sz].age); printf("請輸入電話:"); scanf("%s", con->peoples[con->sz].tele); printf("請輸入住址:"); scanf("%s", con->peoples[con->sz].add); con->sz++; system("cls"); printf("添加成功!\n"); } //查找函數(shù),用于通過姓名查找通訊錄中的聯(lián)系人下標(biāo),若找到返回下標(biāo),若找不到返回sz int find(contact* con,const char* name) { assert(con); int i = 0; for (i = 0; i < con->sz; i++) { if (strcmp(name, con->peoples[i].name) == 0) { return i; } } return i; } //刪除聯(lián)系人 void del_people(contact* con) { assert(con); system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要刪除的聯(lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { printf("您的通訊錄中沒有名為“%s”的聯(lián)系人\n", h); return; } memset(con->peoples + flag, 0, sizeof(people)); int i = 0; for (i = flag; i < con->sz-1; i++) { people tmp = con->peoples[i]; con->peoples[i] = con->peoples[i + 1]; con->peoples[i + 1] = tmp; } con->sz--; system("cls"); printf("刪除成功!\n"); } //打印通訊錄 void PRIN_CON(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("********************************************\n"); printf("姓名 性別 年齡 電話 住址\n"); int i = 0; for (i = 0; i < con->sz; i++) { if(con->peoples[i].first==1) printf("%-10s%-8s%-6d%-11s%s\n", con->peoples[i].name, con->peoples[i].sex, con->peoples[i].age, con->peoples[i].tele, con->peoples[i].add); } for (i = 0; i < con->sz; i++) { if (con->peoples[i].first != 1) printf("%-10s%-8s%-6d%-11s%s\n", con->peoples[i].name, con->peoples[i].sex, con->peoples[i].age, con->peoples[i].tele, con->peoples[i].add); } printf("********************************************\n"); } //查找聯(lián)系人 void find_people(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要查找的聯(lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { system("cls"); printf("您的通訊錄中沒有名為“%s”的聯(lián)系人\n", h); return; } printf("********************************************\n"); printf("姓名 性別 年齡 電話 住址\n"); printf("%-10s%-8s%-6d%-11s%s\n", con->peoples[flag].name, con->peoples[flag].sex, con->peoples[flag].age, con->peoples[flag].tele, con->peoples[flag].add); printf("********************************************\n"); } //修改聯(lián)系人 void change_people(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要修改的聯(lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { printf("您的通訊錄中沒有名為“%s”的聯(lián)系人", h); return; } printf("您想將姓名修改為:"); scanf("%s", con->peoples[flag].name); printf("您想將性別修改為:"); scanf("%s", con->peoples[flag].sex); printf("您想將年齡修改為:"); scanf("%d", &con->peoples[flag].age); printf("您想將電話修改為:"); scanf("%s", con->peoples[flag].tele); printf("您想將住址修改為:"); scanf("%s", con->peoples[flag].add); printf("修改完成!\n"); } //設(shè)置置頂 void fir_people(contact* con) { system("cls"); if (con->sz == 0) { printf("您的通訊錄目前沒有聯(lián)系人\n"); return; } printf("請輸入您要置頂或取消置頂?shù)穆?lián)系人姓名:"); char h[10]; scanf("%s", h); int flag = find(con, h); if (flag == con->sz) { printf("您的通訊錄中沒有名為“%s”的聯(lián)系人", h); return; } if (con->peoples[flag].first == 1) { con->peoples[flag].first = 0; } else if (con->peoples[flag].first == 0) { con->peoples[flag].first = 1; } printf("設(shè)置成功!\n"); } //聯(lián)系人排序 int sex_cmp(const void* str1,const void* str2)//性別排序 { people* a = (people*)str1; people* b = (people*)str2; return -strcmp(a->sex, b->sex); } int age_cmp(const void* str1, const void* str2)//年齡排序 { people* a = (people*)str1; people* b = (people*)str2; return (a->age - b->age); } int tele_cmp(const void* str1, const void* str2)//電話排序 { people* a = (people*)str1; people* b = (people*)str2; return strcmp(a->tele, b->tele); } void sort_people(contact* con) { system("cls"); printf("請選擇排序標(biāo)準(zhǔn)\n"); printf("1,性別\n"); printf("2,年齡\n"); printf("3,電話\n"); printf("請選擇:"); int n = 0; scanf("%d", &n); if(n==1) qsort(con->peoples, con->sz, sizeof(people), sex_cmp); else if(n==2) qsort(con->peoples, con->sz, sizeof(people), age_cmp); else if(n==3) qsort(con->peoples, con->sz, sizeof(people), tele_cmp); printf("排序成功!\n"); PRIN_CON(con); }
以上就是C語言多功能動態(tài)通訊錄實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于C語言多功能動態(tài)通訊錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++數(shù)據(jù)精度問題的解決方案(對浮點(diǎn)數(shù)保存指定位小數(shù))
對浮點(diǎn)數(shù)保存指定位小數(shù),怎么解決這個問題呢?如果有小伙伴對C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧2017-08-08c/c++靜態(tài)庫之間相互調(diào)用的實(shí)戰(zhàn)案例
C++調(diào)用C的函數(shù)比較簡單,直接使用extern "C" {}告訴編譯器用C的規(guī)則去編譯C代碼就可以了,下面這篇文章主要給大家介紹了關(guān)于c/c++靜態(tài)庫之間相互調(diào)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08C語言動態(tài)內(nèi)存管理的原理及實(shí)現(xiàn)方法
C語言動態(tài)內(nèi)存管理的原理是通過 malloc() 函數(shù)申請一塊連續(xù)的內(nèi)存空間,并返回其地址,通過 free() 函數(shù)釋放該內(nèi)存空間。實(shí)現(xiàn)方法是通過在程序運(yùn)行時動態(tài)地管理內(nèi)存,即在需要內(nèi)存時申請,不需要時釋放,避免了靜態(tài)內(nèi)存分配的浪費(fèi)和不足2023-04-04c語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例
下面小編就為大家?guī)硪黄猚語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09