我正在尝试编写一个程序,它会从用户那里获取信息,用户可以选择做什么。选项是添加,修改,删除,显示某些信息,查找平均值,然后退出。 我已经为所有这些代码编写了代码,但我无法使用我的删除功能。 这是我的代码:
void delete_student(struct students *list, int *count) //Delete's Selected student
{
int id4;
int k;
if (*count != 0)
{
printf("\nEnter the ID of the student you wish to delete: ");
scanf("%d\n", &id4);
for (int i = 0; i < *count; i++) //Searches for the selected student
{
k = i;
if (list[i].id == id4)
{
printf("\nStudent found.\nDeleting...\n");
for (int c = k; c < *count; c++) //Deletes the student if found
{
list[c].id = list[c + 1].id;
strcpy(list[c].name, list[c + 1].name);
list[c].age = list[c + 1].age;
strcpy(list[c].dept, list[c + 1].dept);
list[c].grade = list[c + 1].grade;
}
*count = *count - 1;
printf("\nDeletion Complete.\n");
break;
}
else
printf("\nStudent not found. Please try again.\n");
break;
}
}
else
printf("\nNo student's to delete.\n");
}
编辑: 当我通过程序,并选择使用此功能时,它会询问我“ID”,然后它什么都不做,并且光标闪烁。
有人能告诉我我做错了什么吗? 如果需要,可以使用更多代码。
这是最后一个元素的删除方式:
list[*count].id = 0;
strcpy(list[*count].name, NULL);
list[*count].age = 0;
strcpy(list[*count].dept, NULL);
list[*count].grade = 0;
答案 0 :(得分:1)
在break
循环结束时,您可能不应该有for
语句。只需删除那个。
else
printf("\nStudent not found. Please try again.\n");
break;
} ^
|
+------ this one
那printf
也有点不准确;它将在循环的每次迭代中打印出来,而您没有找到匹配的ID。
答案 1 :(得分:1)
您的scanf()
语句的格式字符串不正确。您不需要添加尾随换行符; scanf照顾它。将该行更改为scanf("%d", &id4);
(无新行),它应该有效
我刚刚编写了一个小的存根程序,用于比较带有和不带换行符的scanf,它会复制你的错误。
答案 2 :(得分:1)
这个循环:
for (int c = k; c < *count; c++)
应该是:
for (int c = k; c < *count - 1; c++)
如上所述,它在有效数组的末尾读取一个。结果未定义。特别是,strcpy
电话可能会非常糟糕。当它到达该循环中的最后一个条目时,list[c+1]
引用一个不存在的条目(基于* count)。
答案 3 :(得分:0)
您scanf
因为永远无法读取您的号码而挂起。不需要\n
。仅使用%d
。