C語言多功能動態(tài)通訊錄實現(xiàn)示例
前言
本文將模塊化地介紹如何實現(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)系人的信息暫定為五項,分別是姓名、性別、年齡、電話、住址,因為要為后面第八個功能——聯(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//通訊錄每次擴容增加的人數(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ù)實現(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");//開辟失敗報錯,顯示錯誤位置
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ù)
因為通訊錄有許多功能(刪除,查找,修改,置頂)都需要用到查找,于是寫出一個公用函數(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));//增加一次擴容的空間
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擴容成功\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)系人,因為有置頂功能的存在,需要遍歷兩次,第一次打印被置頂?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實現(xiàn)對信息的檢索,就不必死板地搜索全名了,例如你可以搜索“張三”,以此檢索在姓名、地址、簡介等所有包括“張三”的信息并返回其聯(lián)系人的信息。
2,額外功能優(yōu)化
可以額外增加收藏夾,黑名單,群組等等功能,在聯(lián)系人信息格式里面多加幾個變量即可,只是在打印的時候需要多加注意一些相悖的功能,例如進(jìn)入黑名單后應(yīng)自動取消置頂、收藏等。且打印時不再打印黑名單內(nèi)的聯(lián)系人。
3,打印優(yōu)化
設(shè)置更多的打印方法,例如單獨打印黑名單,單獨打印置頂,單獨打印收藏夾等等。亦可以設(shè)置打印打印聯(lián)系人的某項信息,例如只打印姓名,只打印電話等等。
四、源代碼
下面放出源代碼,可以直接用哦
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//通訊錄每次擴容增加的人數(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),找不到返回sz2,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");//開辟失敗報錯,顯示錯誤位置
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));//增加一次擴容的空間
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擴容成功\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)通訊錄實現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于C語言多功能動態(tài)通訊錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++數(shù)據(jù)精度問題的解決方案(對浮點數(shù)保存指定位小數(shù))
對浮點數(shù)保存指定位小數(shù),怎么解決這個問題呢?如果有小伙伴對C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧2017-08-08
c/c++靜態(tài)庫之間相互調(diào)用的實戰(zhàn)案例
C++調(diào)用C的函數(shù)比較簡單,直接使用extern "C" {}告訴編譯器用C的規(guī)則去編譯C代碼就可以了,下面這篇文章主要給大家介紹了關(guān)于c/c++靜態(tài)庫之間相互調(diào)用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
C語言動態(tài)內(nèi)存管理的原理及實現(xiàn)方法
C語言動態(tài)內(nèi)存管理的原理是通過 malloc() 函數(shù)申請一塊連續(xù)的內(nèi)存空間,并返回其地址,通過 free() 函數(shù)釋放該內(nèi)存空間。實現(xiàn)方法是通過在程序運行時動態(tài)地管理內(nèi)存,即在需要內(nèi)存時申請,不需要時釋放,避免了靜態(tài)內(nèi)存分配的浪費和不足2023-04-04

