【C语言】通讯录《静态内存版本》③

时间:2023-02-25 22:57:57

????write in front????   

????大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4~2021博客之星TOP100~2022博客之星TOP63~作者周榜84﹣作者总榜704~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+????

????本文由 謓泽 原创 如需转载还请通知⚠

????个人主页-​謓泽51Ctop的博客​????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????

????系列专栏-​謓泽51Ctop的博客_【C语言】从0~1_51CTO博客​????
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本????

 ????删除通讯录的信息 

删除通讯录的信息实际上就是假设我们输入了一组通讯录的信息,我们不想要了的话那么我们可以进行删除,这样当我们打印通讯录的信息就不会再有原来我们输入的那组信息了。

void DeLete_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
//通讯录为空的时候
if (pc->sz == 0)
{
printf("通讯录当中没有任何信息\n");
return;
}
printf("请输入你要删除的名字->:\n");
scanf("%s", name);
//查找要删除的人:有/没有
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("没有查找到当前人的信息\n");
return;
}
//删除
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->date[i] = pc->date[i + 1];
}
pc->sz--;//因为我们删除成功下标要减1
printf("★恭喜你~删除信息成功★\n");
printf("\n");
}

【C语言】通讯录《静态内存版本》③

在这里我们还创建了一个函数 FindByname(),它的功能实际上就是要帮我们查找通讯录当中人员的信息存在不存在,以输入名字的形式来进行查找通讯录人员的信息。

static int FindByname(Contact* pc, char name[])
{
int i = 0;
//用for循环进行遍历
for (i = 0; i < pc->sz; i++)
{
//strcmp()比较字符串
if (strcmp(pc->date[i].name, name) == 0)
{
return i;//返回下标
}
}
return -1;
}

【C语言】通讯录《静态内存版本》③

在这里我们用静态局部变量 static 修饰函数↓

函数被静态 (static) 修饰函数也是在其他的源文件是不能被使用的,只能在源文件当中去进行使用 !

那我们程序运行下看看是不是达到了我们想实现的一个效果。

【C语言】通讯录《静态内存版本》③

运行结果证明程序是成功的ヽ(✿゚▽゚)ノ


????查找通讯录的信息 

查询通讯录和我们上面实现的 FindByname() 都是很类似的。

void Find_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
printf("请输入你要删除的名字->:");
scanf("%s", name);
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("没有查找到当前人的名字\n");
return;
}
else
{
printf("|-------------------------------------------------------|\n");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");

printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n",
pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].genger,
pc->date[ret].telephone,
pc->date[ret].address);
}
}

让我们来查找下"张三"的信息。 

【C语言】通讯录《静态内存版本》③

是不是查找成功了(^∀^●)ノシ 

 ????修改指定通讯录人的信息

那么假设我输入了一个人的信息,但是我后面想要修改掉换成另外一个人的信息怎么办。如下代码所示↓ 

void Revise_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
printf("请输入你要修改通讯录人的名字->:");
scanf("%s", name);
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("当前修改人的信息不存在\n");
return;
}
else
{
printf("请输入修改人的名字->:");
scanf("%s", pc->date[ret].name);//注意→数组名是首元素地址,所以不用进行取地址.

printf("请输入修改人的年龄->:");
scanf("%s", pc->date[ret].age);

printf("请输入修改人的性别->:");
scanf("%s", pc->date[ret].genger);

printf("请输入修改人的电话->:");
scanf("%s", pc->date[ret].telephone);

printf("请输入修改人的地址->:");
scanf("%s", pc->date[ret].address);
printf("恭喜你,修改成功~\n");
}
}

【C语言】通讯录《静态内存版本》③

那么让我们来看看修改结果。 

【C语言】通讯录《静态内存版本》③

修改结果成功了ヽ(✿゚▽゚)ノ 


????排查通讯录当中人员的信息

这里我们排查通讯录当中人员的信息实际上就是通过名字来进行序的,用qsort()函数通过比较首字母来进行排序。

int sort_name_max(const void* e1, const void* e2)
{
return (strcmp(((struct Contact*)e1)->date->name, ((struct Contact*)e2)->date->name));
}

void Check_Contact(Contact* pc)
{
//qosrt()函数首字母进行排序
qsort(pc->date, pc->sz, sizeof(pc->date[0]), sort_name_max);
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");
int i;
for (i = 0; i < pc->sz; i++)
{
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].genger,
pc->date[i].telephone,
pc->date[i].address);
}
}

让我们来输入三组信息来看下,是不是可以通过排查通讯录当中人员的信息。 

【C语言】通讯录《静态内存版本》③

从上述的运行结果可以看出,编译器进行了排查。根据ASCll码的值从小到大进行了排序。