我的项目是创建一个带有菜单的程序,该菜单从文件中提取数据并将其排列在结构中。通过菜单,您可以将行插入结构的末尾或从结构中删除行。然后程序复制结构并将其保存到同一文件中。
到目前为止,除了删除行外,我的一切工作正常。
现在我的代码将删除结构的最后一行,无论如何。
else if( input == 3)
{
int delete;
printf("Enter row number to be deleted:\n");
scanf("%i", &delete);
if( delete > i )
{
printf("ERROR: Please enter a valid integer\n");
}
strcpy(data[delete].First, data[(delete+1)].First);
strcpy(data[delete].Last, data[(delete+1)].Last);
data[delete].Gender = data[(delete+1)].Gender;
data[delete].Age = data[(delete+1)].Age;
data[delete].Weight = data[(delete+1)].Weight;
data[delete].Height = data[(delete+1)].Height;
i = i - 1;
}
变量i
是一个计数器,用于跟踪结构中的行数。在我看来,代码应该替换输入删除的数据,并将其替换为结构中它上面的数据,但它不起作用。
我是以错误的方式解决这个问题吗?
答案 0 :(得分:0)
变量i是一个跟踪行数的计数器......
由于您删除data[delete]
,因此行显然从 0 到 i-1 进行编号。 if
错误条件delete > i
应该是delete >= i
。
如果订单不重要,请将最后一个元素与正在交换的元素交换 删除(除非你明显删除最后一个元素),然后 只是减少一个。不需要循环。 - WhozCraig
当然,这是正确的,尽管交换部分没有任何意义将要删除的元素复制到最后一个元素的位置。
如果要保留订单,我们也可以不使用显式循环:
memmove(data+delete, data+delete+1, (--i-delete) * sizeof *data);