接着上一篇。
上一篇的指定删除还有一定的问题,我让用户输入要删除的联系人的名字,然后查询这个名字是否存在,再去删除。但是这里忽略了一个问题,如果两人名字一样呢?其它也有这样的问题,年龄,电话号码前几位等等,我们都不可避免地想到会出现相同的情况。今天在考虑这个问题的时候,我调起程序测试代码,看到了这么一个画面:
5对应的是展示功能。图里可以看到,前面的序号是独一无二的,这个序号我称它们为代号。代号既然展示中会出现带代号,那么我也可以用代号来完成删除。在删除之前不再问用户是否需要看联系人信息,而是固定展示一次,这样用户得到信息后,后面让用户输入要删除的代号即可,也就不担心相同联系人情况了。用一个变量接收代号后,这个变量-1也就是指定联系人的下标。不过还有一个问题,如果用户输入的代号也不存在呢?那while一下
所以如果一直不输入正确,那就一直重新下去。
这样指定删除的代码就又改善了一下
static int SpecifyDel(Contact* ps)
{
assert(ps);
int j = 0;
int i = 0;
int m = 0;
printf("请输入要删除的代号: >");
while (scanf("%d", &m) != EOF)
{
if (m < 1 || m > ps->sz)
{
printf("此代号不存在,请重新输入!\n");
continue;
}
else
break;
}
m -= 1;
FILE* bin = fopen("E://recycle bin.txt", "a");//文件指针,往回收站文本文件里写入
if (bin == NULL)
{
perror("ZDDel::fopen");
printf("文件创建失败,请重新进行删除\n");
return 1;
}
fprintf(bin, "姓名:%s 性别:%s 地址:%s 工作:%s 电话:%s 年龄:%d\n", ps->data[m].name, ps->data[m].gender, ps->data[m].address, ps->data[m].work, ps->data[m].number, ps->data[m].age);
fclose(bin);
bin = NULL;
for (j = m; j < ps->sz - 1; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->sz--;
printf("成功删除指定联系人\n");
return 0;
}
没有用到FindByName,不过还是要返回数字。
当然还有一个问题,如果就是出现极其极其微小的概率,两个联系人所有信息都相等呢?这电脑也不会了,还是让用户自己先确定哪个是哪个吧......
以及存入文件时也可改成代号来主导。
一小篇博文。
结束。